AHK调用opencv(十六)形态转换 – ahk_v2_beta3

形态学变换是基于图像形状的一些简单操作。它通常在二值图像上执行。它需要两个输入,一个是我们的原始图像,第二个是决定操作性质的结构元素或内核。两个基本的形态学操作是腐蚀和膨胀。

  • 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
}

效果图:

AHK调用opencv(十六)形态转换 – ahk_v2_beta3

  • 2.膨胀

它与腐蚀正好相反。这里,如果内核下至少有一个像素为“1”,则像素元素为“1”。所以它会增加图像中的白色区域,或者增加前景对象的大小。通常情况下,在去除噪音的情况下,腐蚀后会膨胀。因为,腐蚀消除了白噪声,但它也缩小了我们的对象。所以我们扩大它。由于噪音消失了,它们不会再回来,但我们的目标区域会增加到腐蚀之前的状态。它还可用于连接对象的断开部分。

dilation := cv.dilate(img,kernel)

效果图:

AHK调用opencv(十六)形态转换 – ahk_v2_beta3

  • 3.开运算

开只是腐蚀的另一个名称,随后是膨胀。正如我们上面所解释的,它对消除噪音很有用。在这里,我们使用 **cv.morphologyEx()**。

这里更换了一张带有噪点的图像,可以看到转换后噪点全部消失

opening := cv.morphologyEx(img_, CV_MORPH_OPEN:=2, kernel)

效果图:

AHK调用opencv(十六)形态转换 – ahk_v2_beta3

  • 4.闭运算

关闭与打开相反,膨胀后腐蚀。它在填充前景对象内的小孔或对象上的小黑点时很有用。

closing := cv.morphologyEx(img_2, CV_MORPH_CLOSE:=3, kernel)

AHK调用opencv(十六)形态转换 – ahk_v2_beta3

  • 5.形态梯度

它是图像的膨胀和腐蚀之间的差值,结果将类似于对象的轮廓。

gradient := cv.morphologyEx(img, CV_MORPH_GRADIENT:=4, kernel)

AHK调用opencv(十六)形态转换 – ahk_v2_beta3

  • 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)

AHK调用opencv(十六)形态转换 – ahk_v2_beta3

  • 7.黑帽

它是原图像和原图像的闭的差值。

kernel_1 := cv.getStructuringElement(CV_MORPH_RECT:=0, ComArrayMake([9,9]))
blackhat := cv.morphologyEx(img, CV_MORPH_BLACKHAT:=6, kernel_1)

AHK调用opencv(十六)形态转换 – ahk_v2_beta3

形态学相关链接:https://homepages.inf.ed.ac.uk/rbf/HIPR2/morops.htm

天黑版opencv_ahk.dll使用(改变了调用方式,优化速度…)

相关文件:https://wwz.lanzouw.com/iAkK803eaaud

cv2.ahk和log.ahk来自社区群友zzZ…

可以用文件中的天黑版的v2h版ahk运行。

示例:形态转换

#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。

给TA捐赠
共{{data.count}}人
人已捐赠
其他

gui控件hotkey获得的键如何使用?

2022-4-2 16:12:15

其他教程

AHK调用opencv(十七)图像梯度 – ahk_v2_beta3

2022-4-2 21:23:15

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
有新私信 私信列表
搜索