栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

[我的OpenCV学习日志]--4 2021/10/26

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[我的OpenCV学习日志]--4 2021/10/26

目录

一、礼帽与黑帽

二、图像梯度——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算子提取出的轮廓与原图的对比:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/350059.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号