首页 > 其他分享 >AHK调用opencv(十六)形态转换 – ahk_v2_beta3

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

时间:2022-10-12 10:56:39浏览次数:79  
标签:kernel img MORPH AHK morphologyEx CV opencv v2 cv

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

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

标签:kernel,img,MORPH,AHK,morphologyEx,CV,opencv,v2,cv
From: https://www.cnblogs.com/ff888/p/16783732.html

相关文章

  • AHK调用opencv(十七)图像梯度 – ahk_v2_beta3
    1.Sobel和Scharr微分Sobel算子是一种联合高斯平滑加微分运算,因此对噪声的抵抗能力更强。可以指定要计算的导数的方向,垂直或水平(分别由参数、Yorder和Xorder指定)......
  • AHK调用opencv(十三)图像的几何变换 – ahk_v2_beta3
    SetWorkingDirA_ScriptDirhOpencv:=DllCall("LoadLibrary","str","opencv_world455.dll","ptr")hOpencvCom:=DllCall("LoadLibrary","str","autoit_opencv_co......
  • AHK调用opencv(五)保存视频
    ;调用opencv录制视频并且保存为文件#NoEnvSendModeInputSetWorkingDir%A_ScriptDir%hOpencv:=DllCall("LoadLibrary","str","opencv_world455.dll","ptr")hO......
  • AHK调用opencv(六)绘图功能
    #NoEnvSendModeInputSetWorkingDir%A_ScriptDir%hOpencv:=DllCall("LoadLibrary","str","opencv_world455.dll","ptr")hOpencvCom:=DllCall("LoadLibrary",......
  • AHK调用opencv(七)鼠标作为画笔
    #NoEnvSendModeInputSetWorkingDir%A_ScriptDir%hOpencv:=DllCall("LoadLibrary","str","opencv_world455.dll","ptr")hOpencvCom:=DllCall("LoadLibrary",......
  • AHK调用opencv(八)作为调色板的跟踪栏
    #NoEnv#Includeopencv_ahk_lib.ahkSendModeInputSetWorkingDir%A_ScriptDir%hOpencv:=DllCall("LoadLibrary","str","opencv_world455.dll","ptr")hOpencvCo......
  • OpenCV-图像读写(java版)
    @​​TOC​​图像读写Imgcodecs类中提供了图像的读写方法。使用imread()函数读取磁盘中的图像;使用imwrite()函数将图像写入磁盘中以下图为例演示。​​(图片来源网络)​​......
  • OpenCV-视频读写(java版)
    @​​TOC​​​​​OpenCV2中提供了两个类来实现视频的读写。读视频的类是​​VideoCapture​​,写视频的类是​​VideoWriter读视频VideoCapture既可以从视频文件读取图......
  • AHK调用opencv(四)播放视频文件
    本节内容对open()的另一种使用参数做了研究,注意这里open()里的参数是文件名。因为视频文件不同于相机,视频文件有时长,所以死循环中需要一个判断,判断视频帧是否结束,如果结束......
  • OpenCV-像素值读写(java版)
    @​​TOC​​​很多时候,我们需要读取某个像素值,或者设置某个像素值,甚至需要遍历整个像素值。​​​OpenCV中RGB图像的通道为BGR!!!​​1.读像素值1.get()函数OpenCV中使用get......