OpenCV系列 - 作者:cc 原链接:https://www.cnblogs.com/ff888/p/16783732.html
形态学变换是基于图像形状的一些简单操作。它通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,第二个是决定操作性质的结构元素或内核。两个基本的形态学操作是腐蚀和膨胀。
- 1.腐蚀
腐蚀算法使二值图像缩小一圈,删除对象边界的某些像素,其运算过程就是使用用3X3的结构元素,扫描二值图像的每一个像素,用结构元素与其覆盖的二值图像做“与”运算,如果都为1,结构图像的该像素为1,否则为0。结果就是使二值图像减小一圈。函数使用一个指定的核元素去腐蚀源图像,内核有一个可定义的 锚点,我们叫他内核中心点,腐蚀操作时,获取内核覆盖区域最小像素值,并代替锚点的像素。
SetWorkingDir A_ScriptDir hOpencv := DllCall("LoadLibrary", "str", "opencv_world455.dll", "ptr") hOpencvCom := DllCall("LoadLibrary", "str", "autoit_opencv_com455.dll", "ptr") DllCall("autoit_opencv_com455.dll\DllInstall", "int", 1, "wstr", A_IsAdmin = 0 ? "user" : "", "cdecl") cv := ComObject("OpenCV.cv") img := cv.imread("j.png") ;腐蚀 kernel := cv.getStructuringElement(CV_MORPH_RECT:=0, ComArrayMake([5,5])) ;CV_MORPH_RECT结构元素是矩形的 erosion := cv.erode(img,kernel) cv.imshow("Original", img) cv.imshow("Blurred1", erosion) cv.waitKey() cv.destroyAllWindows() ComArrayMake(inputArray) { arr := ComObjArray(VT_VARIANT:=12, inputArray.Length) Loop inputArray.Length { arr[A_Index-1] := inputArray[A_Index] } return arr }
效果图:
- 2.膨胀
它与腐蚀正好相反。这里,如果内核下至少有一个像素为“1”,则像素元素为“1”。所以它会增加图像中的白色区域,或者增加前景对象的大小。通常情况下,在去除噪音的情况下,腐蚀后会膨胀。因为,腐蚀消除了白噪声,但它也缩小了我们的对象。所以我们扩大它。由于噪音消失了,它们不会再回来,但我们的目标区域会增加到腐蚀之前的状态。它还可用于连接对象的断开部分。
dilation := cv.dilate(img,kernel)
效果图:
- 3.开运算
开只是腐蚀的另一个名称,随后是膨胀。正如我们上面所解释的,它对消除噪音很有用。在这里,我们使用 **cv.morphologyEx()**。
这里更换了一张带有噪点的图像,可以看到转换后噪点全部消失
opening := cv.morphologyEx(img_, CV_MORPH_OPEN:=2, kernel)
效果图:
- 4.闭运算
关闭与打开相反,膨胀后腐蚀。它在填充前景对象内的小孔或对象上的小黑点时很有用。
closing := cv.morphologyEx(img_2, CV_MORPH_CLOSE:=3, kernel)
- 5.形态梯度
它是图像的膨胀和腐蚀之间的差值,结果将类似于对象的轮廓。
gradient := cv.morphologyEx(img, CV_MORPH_GRADIENT:=4, kernel)
- 6.顶帽
它是原图像和原图像开运算结果的差值。下面是 9×9 核的例子。
kernel_1 := cv.getStructuringElement(CV_MORPH_RECT:=0, ComArrayMake([9,9])) ;CV_MORPH_RECT结构元素是矩形的
tophat := cv.morphologyEx(img, CV_MORPH_TOPHAT:=5, kernel_1)
- 7.黑帽
它是原图像和原图像的闭的差值。
kernel_1 := cv.getStructuringElement(CV_MORPH_RECT:=0, ComArrayMake([9,9]))
blackhat := cv.morphologyEx(img, CV_MORPH_BLACKHAT:=6, kernel_1)
形态学相关链接:https://homepages.inf.ed.ac.uk/rbf/HIPR2/morops.htm
dbgba优化整理OpenCV系列示例打包下载20240513:
天黑版opencv_ahk.dll使用(改变了调用方式,优化速度…)
相关文件:https://wwz.lanzouw.com/iAkK803eaaud
cv2.ahk和log.ahk来自社区群友zzZ…
可以用文件中的天黑版的v2h版ahk运行。
v2H版示例:形态转换
#Dllload lib #DllLoad opencv_ahk.dll #include <cv2> #include <log> SetWorkingDir A_ScriptDir ;初始化opencv模块 cv := ObjFromPtr(DllCall('opencv_ahk.dll\opencv_init', 'ptr', DllCall(A_AhkPath '\ahkGetApi', 'ptr'), 'cdecl ptr')) img := cv.imread("image/j.png") ;腐蚀 kernel := cv.getStructuringElement(cv2.CV_MORPH_RECT, [5,5]) cv.erode(img, erosion := cv.MAT(), kernel) cv.imshow("erosion", erosion) ;膨胀 cv.dilate(img, dilation := cv.MAT(), kernel) cv.imshow("dilation", dilation) ;开运算 img_j1 := cv.imread("image/j_1.png") cv.morphologyEx(img_j1, opening := cv.MAT(), cv2.CV_MORPH_OPEN, kernel) cv.imshow("opening", opening) ;闭运算 img_j2 := cv.imread("image/j_2.png") cv.morphologyEx(img_j2, closing := cv.MAT(), cv2.CV_MORPH_CLOSE, kernel) cv.imshow("closing", closing) ;形态梯度 cv.morphologyEx(img, gradient := cv.MAT(), cv2.CV_MORPH_GRADIENT, kernel) cv.imshow("gradient", gradient) ;顶帽 kernel_1 := cv.getStructuringElement(cv2.CV_MORPH_RECT, [9,9]) ;CV_MORPH_RECT结构元素是矩形的 cv.morphologyEx(img, tophat := cv.MAT(), cv2.CV_MORPH_TOPHAT, kernel_1) cv.imshow("tophat", tophat) ;黑帽 cv.morphologyEx(img, blackhat := cv.MAT(), cv2.CV_MORPH_BLACKHAT, kernel_1) cv.imshow("blackhat", blackhat) cv.waitKey() cv.destroyAllWindows()
有错误请联系我改正!
本系列所有贡献者(AutoHotKey中文社区群友)不分先后:天黑请闭眼,zzZ…,演好自己,僵尸,城西,Tebayaki。
评论(0)