Opencv图像梯度

文章目录

1 理论

  Opencv提供了三种类型的梯度滤波器,又称高通滤波器,包括Sobel、Scharr和Laplacian。

1.1 Sobel和Scharr算子

  Sobel算子是高斯平滑加微分运算的联合运算,能够更抗噪声。逆可以指定要采用的导数方向,垂直或水平,分别对应参数yorder和xorder。内核的大小则通过ksize指定。
  特别的,当ksize设置为-1时,将使用 3 × 3 3 \times 3 3×3Scharr滤波器,比 3 × 3 3 \times 3 3×3Sobel效果更好。

1.2 Laplacian算子

  Laplacian计算了由以下关系给出的图像的laplacian图:
Δ s r c = ∂ 2 s r c ∂ x 2 + ∂ 2 s r c ∂ y 2 \Delta src = \frac{\partial ^2{src}}{\partial x^2} + \frac{\partial ^2{src}}{\partial y^2} Δsrc=∂x2∂2src​+∂y2∂2src​  如果ksize设置为1,则以上以下内核进行过滤:
k e r n e l = [ 0 1 0 1 − 4 1 0 1 0 ] kernel = \begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix} kernel=⎣⎡​010​1−41​010​⎦⎤​

2 代码

import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('1.jpg', 0)
laplacian = cv.Laplacian(img, cv.CV_64F)
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)
sobely = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=5)
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(laplacian, cmap='gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(sobelx, cmap='gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(sobely, cmap='gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()

  输出如下:
Opencv图像梯度

3 检测两个边缘

  检测两个边缘时,一个好的选择是将输出数据类型保留为更高的形式,例如cv.CV_16S、cv.CV_64F等,取绝对值后再转换为cv.CV_8U:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imread('1.jpg', 0)
sobel = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)
sobel_abs = np.absolute(sobel)
sobel_8u = np.uint8(sobel_abs)
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(sobel, cmap='gray')
plt.title('Sobel'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(sobel_abs, cmap='gray')
plt.title('Absolute'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(sobel_8u, cmap='gray')
plt.title('Uint8'), plt.xticks([]), plt.yticks([])
plt.show()

  输出如下:
Opencv图像梯度

上一篇:Sobel边缘检测算法verilog实现及仿真


下一篇:Sobel边缘检测算子OpenCV实现