OpenCV--图像梯度处理
2020-11-20 本文已影响0人
Dayon
![](https://img.haomeiwen.com/i1316211/84bd84b3542550ff.png)
-
cv2.Sobel(src, ddepth, dx, dy, ksize) 进行sobel算子计算
参数说明:
src:表示当前图片,
ddepth:表示图片深度,这里使用cv2.CV_64F使得结果可以是负值,
dx:表示x轴方向,
dy:表示y轴方向, ksize表示移动方框的大小 -
cv2.convertScalerAbs(src) 将像素点进行绝对值计算
参数说明:
src:表示当前图片
sobel算子:分为x轴方向和y轴方向上的,
x轴方向上的算子如图中的Gx,将sober算子在图中进行平移,当前位置的像素值等于sobel算子与(当前位置与周边位置8个点)进行对应位置相乘并相加操作,作为当前位置的像素点(右减左)
y轴方向的算子如Gy, 对于x轴方向上,即左右两边的比较(下减上)计算方程为:x轴: p3 - p1 + 2 * p6 - 2 * p4 + p9 - p7, 右边的像素值减去左边的像素值
![]()
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)# 1,0: 表示只算水平的,不算竖直的
sobelxx = cv2.convertScaleAbs(sobelx) #白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelyy = cv2.convertScaleAbs(sobely)
# 分别计算x和y,再求和,融合的较好
sobelxy_1 = cv2.addWeighted(sobelxx,0.5,sobelyy,0.5,0)
# 不建议直接计算,融合的不好
sobelxy_2 = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
# cv_show('pie',img)
cv2.imshow('sobelx',sobelx)
cv2.imshow('sobelxx',sobelxx)
cv2.imshow('sobely',sobely)
cv2.imshow('sobelyy',sobelyy)
cv2.imshow('sobelxy_1',sobelxy_1)
cv2.imshow('sobelxy_2',sobelxy_2)
cv2.waitKey(0)
cv2.destroyAllWindows()
白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要用convertScalerAbs取绝对值
注:图sobelx,右半边也有梯度,但是是从黑到白,所以为0(黑),所以看不出来。(图sobely的下半部分同理)
Lena图像的sobel水平竖直方向的操作效果
图像梯度-Scharr算子与laplacian算子
laplacian (lɑ:'plɑ:siən) 拉普拉斯算子
laplacian算子计算方程为:p2 + p4 + p6 +p8 - 4 * p5
Scharr算子和Sobel算子的用法相同,Laplacian算子就不存在x y了
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
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((img,sobelxy,scharrxy,laplacian))
cv_show(res,'res')
![](https://img.haomeiwen.com/i1316211/085741608c536d96.png)