OpenCV图像梯度计算

一、Sobel算子

G_{x}=\begin{bmatrix} -1 & 0 & +1\\ -2& 0 &+2 \\ -1& 0 & +1 \end{bmatrix}*A\ \ and \ \ G_{y}=\begin{bmatrix} -1 & -2 & -1\\ 0& 0 &0 \\ +1& +2 & +1 \end{bmatrix}*A

二、计算图像梯度

dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

ddepth:图像的深度

dx和dy分别表示水平和竖直方向

ksize是Sobel算子的大小

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('./noisy.jpg', cv2.IMREAD_GRAYSCALE)

#滤波
img = cv2.medianBlur(img, 5)

#计算x方向梯度
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)

#计算y方向梯度
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)

#梯度融合
sobel = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)

plt.figure()
plt.subplot(2, 2, 1)
plt.imshow(img, 'gray')
plt.title('ORIGINAL')
plt.subplot(2, 2, 2)
plt.imshow(sobel, 'gray')
plt.title('SOBEL')
plt.subplot(2, 2, 3)
plt.imshow(sobelx, 'gray')
plt.title('sobelx')
plt.subplot(2, 2, 4)
plt.imshow(sobely, 'gray')
plt.title('sobely')
plt.show()

sobel

三、其他算子及几种算子的比较

1.Scharr算子

G_{x} = \begin{bmatrix} -3 & 0 & 3\\ -10 & 0 &10 \\ -3&0 &3 \end{bmatrix}*A \ \ and\ \ G_{y}= \begin{bmatrix} -3 &-10 &-3 \\ 0& 0 &0 \\ -3& -10 &-3 \end{bmatrix}*A

2.Laplacian算子

G = \begin{bmatrix} 0 & 1 &0 \\ 1 & -4 &1 \\ 0& 1 &0 \end{bmatrix}*A

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('./noisy.jpg', cv2.IMREAD_GRAYSCALE)

#滤波
img = cv2.medianBlur(img, 5)

#sobel算子
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)
sobel = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)

#scharr算子
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharry = cv2.convertScaleAbs(scharry)
scharr = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)

#laplacian算子
laplacian = cv2.Laplacian(img, cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

plt.figure()
plt.subplot(2, 2, 1)
plt.imshow(img, 'gray')
plt.title('ORIGINAL')
plt.subplot(2, 2, 2)
plt.imshow(sobel, 'gray')
plt.title('SOBEL')
plt.subplot(2, 2, 3)
plt.imshow(scharr, 'gray')
plt.title('SCHARR')
plt.subplot(2, 2, 4)
plt.imshow(laplacian, 'gray')
plt.title('LAPLACIAN')
plt.show()

算子

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值