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”。所以它会增加图像中的白色区域,或者增加前景对象的大小。通常情况下,在去除噪音的情况下,腐蚀后会膨胀。因为,腐蚀消除了白噪声,但它也缩小了我们的对象。所以我们扩大它。由于噪音消失了,它们不会再回来,但我们的目标区域会增加到腐蚀之前的状态。它还可用于连接对象的断开部分。

  1. dilation := cv.dilate(img,kernel)

效果图:

  • 3.开运算

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

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

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

效果图:

  • 4.闭运算

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

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

  • 5.形态梯度

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

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

  • 6.顶帽

它是原图像和原图像开运算结果的差值。下面是 9×9 核的例子。

  1. kernel_1 := cv.getStructuringElement(CV_MORPH_RECT:=0, ComArrayMake([9,9])) ;CV_MORPH_RECT结构元素是矩形的
  2. tophat := cv.morphologyEx(img, CV_MORPH_TOPHAT:=5, kernel_1)

  • 7.黑帽

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

  1. kernel_1 := cv.getStructuringElement(CV_MORPH_RECT:=0, ComArrayMake([9,9]))
  2. 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。

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。