一般来讲,只有色彩变化较大的地方才会产生,也就是说,只有在边缘。
图像sobel算子
这个是水平方向的梯度,右边减去左边
同样,下边减去上边。是竖直方向
原始图像
现在采用sobel算子,水平方向右边减去左边。
如下所示:
可以看到只有左边的,因为我们采用的是右边减去左边,其中中间的为白色,减去左边的黑丝就是 >0,因此会保留,而右边减去左边,是黑色减去中间,就成了黑丝减去白色<0所以会不显示。
也就是只有一半
如果想把右边的一半也显示,怎么办了?当然可以考虑将负数编程整数麻,试试看。
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(‘sobelx’,sobelx)
经过测试发现,果然好使
sobelx = cv2.convertScaleAbs(sobelx)
cv_show('sobelx',sobelx)
# 经过测试发现,果然好使
我们发现,的确在左边和右边已经出现了圆的轮廓雏形。
sobelx = cv2.convertScaleAbs(sobelx)
cv_show('sobelx',sobelx)
# 经过测试发现,果然好使
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
cv_show('sobely',sobely)
#分别计算x和y,在求和,这样会不会弥补单独求时的不足了?
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show("sobelxy",sobelxy)
如上图可以看出来,效果并不好,因此建议分开处理,再加和。
import cv2
import numpy as np
lena = cv2.imread("lena.jpg")
lena=cv2.cvtColor(lena,cv2.COLOR_BGR2GRAY)
lena = cv2.medianBlur(lena,5)
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv_show("lena",lena) # 显示一下原图
整体计算,全部设置为1如下
# 整体设置为1,一起进行计算
sobelxy = cv2.Sobel(lena,cv2.CV_64F,1,1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)
sobelxy1 = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show("sobelxy1",sobelxy1)
sobelxy_show = np.hstack((sobelxy,sobelxy1))
cv_show("sobelxy_show",sobelxy_show)
由此可知分开计算效果好一些,而单独计算会有重影
——————————————————————————————————————————————
拉普拉斯二阶导
soble ,
scharrx,
laplacian
对比
在这里插入图片描述
import cv2
import numpy as np
lena = cv2.imread("lena.jpg")
# 中值滤波去除椒盐噪声
lena = cv2.medianBlur(lena,5)
# 灰度化处理,看的更清楚
lena=cv2.cvtColor(lena,cv2.COLOR_BGR2GRAY)
# sobel算法处理
sobelx = cv2.Sobel(lena,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(lena,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show("sobelxy",sobelxy)
# scharr算法处理
scharrx = cv2.Scharr(lena,cv2.CV_64F,1,0)
scharrx = cv2.convertScaleAbs(sobelx)
scharry = cv2.Scharr(lena,cv2.CV_64F,1,0)
scharry = cv2.convertScaleAbs(sobely)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv_show("scharrxy",scharrxy)
# laplacian算法处理
laplacian = cv2.Laplacian(lena,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
cv_show("laplacian",laplacian)
import numpy as np
sum_show = np.hstack((lena,sobelxy,scharrxy,laplacian))
cv_show("sum_show",sum_show)
(完)