- 1.Sobel 和 Scharr 微分
Sobel 算子是一种联合高斯平滑加微分运算,因此对噪声的抵抗能力更强。可以指定要计算的导数的方向,垂直或水平(分别由参数、Yorder 和 Xorder 指定)。还可以通过参数 ksize 指定内核的大小。如果 ksize=-1,则使用 3×3 Scharr 滤波器,这比 3×3 Sobel 滤波器效果更好。
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("td.png",0)
;核函数的取值范围:1,3,5,7,9
sobelx := cv.Sobel(img,CV_8U:=0,1,0,ksize:=3)
sobely := cv.Sobel(img,CV_8U:=0,0,1,ksize:=3)
cv.imshow("Image", img)
cv.imshow("Image3", sobelx)
cv.imshow("Image4", sobely)
cv.waitKey()
cv.destroyAllWindows()
效果图:
- 2.Laplacian 微分
OpenCV提供了通过Laplacian算子提取图像边缘的Laplacian()函数,该函数利用Laplacian算子提取图像中的边缘信息,与Soble()函数相同,函数的前两个参数分别为输入图像和输出图像,第三个参数为输出图像的数据类型,这里需要注意由于提取边缘信息时有可能会出现负数,因此不要使用CV_8U数据类型的输出图像,否则会使得图像边缘提取不准确。函数第四个参数是滤波器尺寸的大小,必须是正奇数,当该参数的值大于1时,该函数通过Sobel算子计算出图像X方向和Y方向的二阶导数,将两个方向的导数求和得到Laplacian算子。
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("td.png",0)
;核函数的取值范围:1,3,5,7,9
laplacian := cv.Laplacian(img,CV_16U:=2,ksize:=3)
laplacian := cv.convertScaleAbs(laplacian)
cv.imshow("Image", img)
cv.imshow("Image1", laplacian)
cv.waitKey()
cv.destroyAllWindows()
效果图:
天黑版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/td.png")
cv.Laplacian(img, laplacian := cv.MAT(), cv2.CV_16U, 3)
cv.convertScaleAbs(laplacian, laplacian)
cv.Sobel(img, sobelx := cv.MAT(), cv2.CV_8U, 1, 0, 3)
cv.Sobel(img, sobelY := cv.MAT(), cv2.CV_8U, 0, 1, 3)
cv.imshow("laplacian", laplacian)
cv.imshow("sobelx", sobelx)
cv.imshow("sobely", sobely)
cv.waitKey()
cv.destroyAllWindows()
有错误请联系我改正!
本系列所有贡献者(AutoHotKey中文社区群友)不分先后:天黑请闭眼,zzZ…,演好自己,僵尸,城西,Tebayaki。