问题描述:
Laplacian、Sobel X、Sobel Y有什么区别呢?
问题解答:
Laplacian、Sobel X 和 Sobel Y 是三种不同的边缘检测算子,它们在原理、方向和应用上有明显的区别:
1. Laplacian
- 原理:Laplacian 是一种二阶导数算子,用于检测图像中亮度变化的区域。它通过计算图像的二阶导数来识别边缘。
- 特征:能够检测到边缘的强度,但不区分边缘的方向。适用于检测图像中的快速变化区域。
- 滤波器:
2. Sobel X
- 原理:Sobel X 是一种一阶导数算子,专门用于检测水平方向的边缘。它通过计算图像的水平梯度来识别边缘。
- 特征:能够突出水平方向的边缘,并且具有抗噪声的特性。
- 滤波器:
3. Sobel Y
- 原理:Sobel Y 也是一种一阶导数算子,但它专门用于检测垂直方向的边缘。通过计算图像的垂直梯度来识别边缘。
- 特征:能够突出垂直方向的边缘,同样具有抗噪声的特性。
- 滤波器:
总结
- 方向:Laplacian 不区分方向,而 Sobel X 和 Sobel Y 分别检测水平方向和垂直方向的边缘。
- 阶数:Laplacian 是二阶导数算子,而 Sobel X 和 Sobel Y 是一阶导数算子。
- 应用:Laplacian 更适合用于整体边缘检测,而 Sobel X 和 Sobel Y 更适合用于提取特定方向的边缘信息。
###################################################
对于一张图像,哪个是图像的x轴,哪个是图像的y轴呢?横着和竖着方向哪个对应的是x轴方向和y方向呢?
在图像处理中,通常约定如下:
- X轴(水平轴):表示图像的横向,水平方向。即从左到右,通常对应于图像的列索引。
- Y轴(垂直轴):表示图像的纵向,竖直方向。即从上到下,通常对应于图像的行索引。
因此,在一张图像中:
- 横向(从左到右)对应于 X 轴。
- 竖向(从上到下)对应于 Y 轴。
这意味着,如果你在图像中移动列(X轴),你会水平移动;而移动行(Y轴)则是垂直移动。
####################################################################
为什么Sobel X检测到的边缘线是竖线呢?
Sobel X 是用于检测水平方向边缘的算子。它通过在图像中计算水平梯度(即 X 方向的变化),强调了在 Y 方向(垂直方向)有显著变化的像素值。因此,当图像中存在竖直边缘时,Sobel X 会在这些边缘处产生较大的响应值,从而检测到竖线。
具体来说,Sobel X 的卷积核形状是:
这个核会增强水平变化而抑制垂直变化,因此当遇到竖直边缘时,会产生明显的响应。
###############################################################
三者的代码如下:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('logo8.jpg',0)
#cv2.CV_64F 输出图像的深度(数据类型),可以使用-1, 与原图像保持一致 np.uint8
laplacian=cv2.Laplacian(img,cv2.CV_64F)
# 参数 1,0 为只在 x 方向求一阶导数,最大可以求 2 阶导数。
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
# 参数 0,1 为只在 y 方向求一阶导数,最大可以求 2 阶导数。
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()
三者的结果如下: