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
}
- 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.顶帽
它是原图像和原图像开运算结果的差值。下面是 9x9 核的例子。
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
天黑版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。