目录
一、礼帽与黑帽
二、图像梯度——Sobel算子
三、图像梯度——Scharr算子;Laplacian算子
一、礼帽与黑帽
(1)礼帽 = 原始输入 - 开运算结果
(2)黑帽 = 闭运算 - 原始输入
用处:
(1)礼帽运算:原图像和开运算结果图之差,常用来分离比邻近点亮一些的斑块,在一幅图像具有大幅的背景而微小物品比较有规律的情况下,可以使用礼帽运算进行背景提取
(2)黑帽运算:突出了比原图像轮廓周围的区域更暗的区域,所以用来分离比邻近点暗一些的斑块,效果图有着非常完美的轮廓
#礼帽
img = cv2.imread('D:/fushi2.jpg')
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv_show('tophat',tophat)
#黑帽
img = cv2.imread('D:/fushi2.jpg')
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
cv_show('blackhat',blackhat)
二、图像梯度——Sobel算子
(1)什么是图像梯度?
在我的理解中,一个图像是清晰还是模糊主要取决于图像的轮廓是否明显,即轮廓边缘的灰度变化强不强烈,图像的梯度就相当于2个相邻像素之间的差值。
(2)在图像中,该算子的大致作用就是找出图中哪些地方存在梯度,即找出图像边缘轮廓,可用于边缘检测
这是一个卷积乘
img = cv2.imread('D:/fzdsuanzi.jpg',cv2.IMREAD_GRAYSCALE)
cv_show('img',img)
原图:
dat = cv2.Sobel(src,ddepth,dx,dy,ksize)
-ddepth:图像的深度
-dx和dy分别表示水平和竖直方向
-ksize是sobel算子的大小
注:在梯度运算中,很可能会出现负的灰度值,我们不能再采用uint8类型作为像素的数据类型,而是采用了CV_64F这种有负数范围的类型,运算结果里的负数我们也不能不处理,否则在显示的时候就会被截断为0,这样就会丢失边界信息。convertScaleAbs函数就是把梯度运算后的图像给正值化,也就是取绝对值
————————————————
版权声明:本文为CSDN博主「naruhina」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/naruhina/article/details/104710805/
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)#cv2.CV_64f的意思是cv2.CV_64F输出图像的深度(数据类型),可以使用-1,与原图像保持一致
sobelx = cv2.convertScaleAbs(sobelx)白到黑是正数,黑到白是负数,所有的负数会被截断成0,所以要取绝对值
cv_show('sobelx',sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize = 3)
sobely = cv2.convertScaleAbs(sobely)
cv_show('sobely',sobely)
分别计算x,y再求和
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show('sobelxy',sobelxy)
不建议直接计算,原因如下:
sobelxy = cv2.Sobel(img,cv2.CV_64F,1,1,ksize = 3)
sobelxy = cv2.convertScaleAbs(sobelxy)
cv_show('sobelxy',sobelxy)
三、图像梯度——Scharr算子;Laplacian算子
1.不同算子的卷积核数值有一些差异。
2.scharr与sobel算子思想一样,只是卷积核的系数不同,scharr算子提取边界也更加灵敏,能提取到更细小的边界,但请注意,越是灵敏就越是可能误判。
3.Laplacian 算子对噪声比较敏感,所以图像一般先经过平滑处理。一般情况下都是将Laplacian算子与其他方法结合一起使用,并不是经常单独使用该算子。
#不同算子之间的差异
import numpy as np
img = cv2.imread('D:/fzdsuanzi.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize = 3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
res = np.hstack((sobelxy,scharrxy,laplacian))
cv_show('res',res)
Scharr算子提取出的轮廓与原图的对比:


![[我的OpenCV学习日志]--4 2021/10/26 [我的OpenCV学习日志]--4 2021/10/26](http://www.mshxw.com/aiimages/31/350059.png)
