sobel/Scharr/Laplacian
OpenCV
提供3种梯度算子(高通滤波器),分别是Sobel、Scharr和Laplacian
OpenCV 官网的代码和效果图片对应不上。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('sudoku.png',0)
laplacian = cv2.Laplacian(img, cv2.CV_64F)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.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()
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('sudoku.png', 0)
scharr_x = cv2.Scharr(img, cv2.CV_8U, 1, 0)
scharr_y = cv2.Scharr(img, cv2.CV_8U, 0, 1)
laplacian = cv2.Laplacian(img, cv2.CV_8U)
sobelx = cv2.Sobel(img, cv2.CV_8U, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_8U, 0, 1, ksize=5)
plt.subplot(2, 3, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 2), plt.imshow(sobelx, cmap='gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 3), plt.imshow(scharr_x, cmap='gray')
plt.title('scharr X'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 4), plt.imshow(laplacian, cmap='gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 5), plt.imshow(sobely, cmap='gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 6), plt.imshow(scharr_y, cmap='gray')
plt.title('scharr Y'), plt.xticks([]), plt.yticks([])
plt.show()
梯度计算时被截断了
import numpy as np
import cv2
from matplotlib import pyplot as plt
# img = cv2.imread('sudoku.png', 0)
img = cv2.imread('box.png', 0)
# Output dtype = cv2.CV_8U
sobelx8u = cv2.Sobel(img, cv2.CV_8U, 1, 0, ksize=5)
# Output dtype = cv2.CV_64F. Then take its absolute and convert to cv2.CV_8U
sobelx64f = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)
plt.subplot(1, 3, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 2), plt.imshow(sobelx8u, cmap='gray')
plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 3), plt.imshow(sobel_8u, cmap='gray')
plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([])
plt.show()
void cv::Sobel ( InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
int ksize = 3,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT
);
cv2.Sobel( src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]] ) -> dst
计算图像的一阶、二阶、三阶
Sobel
梯度,当ksize=1
时,使用 3x1 或者 1x3 的核;ksize=1
时,只计算x
方向或者y
方向的一阶二阶梯度
- src: 输入图像
- dst: 输出图像,通道数和尺寸与源图像一致
- ddepth: 图像的深度,输入为8位,输出结果会截断
- dx:
x
方向梯度值的阶数- dy:
y
方向梯度值的阶数- ksize:
Sobel
算子的Kernel
尺寸,取值为1、3、5、7
- scale: 可选的尺度参数,默认不选用
- delta: 可选的偏移参数,可以增强结果,默认不选用,
- borderType: 扩边类型,不支持
BORDER_WRAP
[ − 1 0 1 − 2 0 2 − 1 0 1 ] \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} ⎣⎡−1−2−1000121⎦⎤
dx = 0, dy = 1, ksize = 3
[ − 1 − 2 − 1 0 0 0 1 2 1 ] \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} ⎣⎡−101−202−101⎦⎤
Laplacian
void cv::Laplacian ( InputArray src,
OutputArray dst,
int ddepth,
int ksize = 1,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT
);
cv2.Laplacian( src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]] ) -> dst
计算图像的
Laplacian
梯度
Laplacian
是一个二阶导数算子
- src: 输入图像
- dst: 输出图像,通道数和尺寸与源图像一致
- ddepth: 图像的深度,输入为
8
位,输出结果会截断- ksize:
Sobel
算子的Kernel
尺寸,取值为正奇数- scale: 可选的尺度参数,默认不选用
- delta: 可选的偏移参数,可以增强结果,默认不选用,
- borderType: 扩边类型,不支持
BORDER_WRAP
[ 0 1 0 1 − 4 1 0 1 0 ] \begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix} ⎣⎡0101−41010⎦⎤
void cv::Scharr ( InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT
);
cv2.Scharr( src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]] ) -> dst
利用
Scharr
算子计算图像的一阶X-
,Y-
方向的梯度;
- src: 输入图像
- dst: 输出图像,通道数和尺寸与源图像一致
- ddepth: 图像的深度,输入为8位,输出结果会截断
- dx:
x
方向梯度值的阶数- dy:
y
方向梯度值的阶数- scale: 可选的尺度参数,默认不选用
- delta: 可选的偏移参数,可以增强结果,默认不选用,
- borderType: 扩边类型,不支持
BORDER_WRAP