所用图像如下,使用时请自行更换Image:
代码
import numpy as np
from scipy.ndimage import rotate
import os
from PIL import Image
import math
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
#Sobel Kernel
sobelH = np.array([[1, 0, -1],
[2, 0, -2],
[1, 0, -1]])
sobelV = sobelH.T
#Scharr Kernel
scharrH = np.array([[3, 0, -3],
[10, 0, -10],
[3, 0, -3]])
scharrV = scharrH.T
#Prewitt Kernel
prewittH = np.array([[1, 0, -1],
[1, 0, -1],
[1, 0, -1]])
prewittV = prewittH.T
#roberts Kernel
robertsH = np.array([[0, 1],
[-1, 0]])
robertsV = np.array([[1, 0],
[0, -1]])
im1SH = cv2.filter2D(im1a, kernel = sobelH, ddepth = -1)
im1SV = cv2.filter2D(im1a, kernel = sobelV, ddepth = -1)
im2SH = cv2.filter2D(im2a, kernel = sobelH, ddepth = -1)
im2SV = cv2.filter2D(im2a, kernel = sobelV, ddepth = -1)
im1ScH = cv2.filter2D(im1a, kernel = scharrH, ddepth = -1)
im1ScV = cv2.filter2D(im1a, kernel = scharrV, ddepth = -1)
im2ScH = cv2.filter2D(im2a, kernel = scharrH, ddepth = -1)
im2ScV = cv2.filter2D(im2a, kernel = scharrV, ddepth = -1)
im1PH = cv2.filter2D(im1a, kernel = prewittH, ddepth = -1)
im1PV = cv2.filter2D(im1a, kernel = prewittV, ddepth = -1)
im2PH = cv2.filter2D(im2a, kernel = prewittH, ddepth = -1)
im2PV = cv2.filter2D(im2a, kernel = prewittV, ddepth = -1)
im1RH = cv2.filter2D(im1a, kernel = robertsH, ddepth = -1)
im1RV = cv2.filter2D(im1a, kernel = robertsV, ddepth = -1)
im2RH = cv2.filter2D(im2a, kernel = robertsH, ddepth = -1)
im2RV = cv2.filter2D(im2a, kernel = robertsV, ddepth = -1)
fig, ax = plt.subplots(nrows=2, ncols=4, figsize=(20, 10))
plt.axis('off')
ax[0, 0].imshow(im1SH, cmap='gray')
ax[0, 0].set_title("Im1 SobelSH Kernel")
ax[0, 0].axis('off')
ax[0, 1].imshow(im1SV, cmap='gray')
ax[0, 1].set_title("Im1 SobelV Kernel")
ax[0, 1].axis('off')
ax[0, 2].imshow(im1ScH, cmap='gray')
ax[0, 2].set_title("Im1 ScharrH Kernel")
ax[0, 2].axis('off')
ax[0, 3].imshow(im1ScV, cmap='gray')
ax[0, 3].set_title("Im1 ScharrV Kernel")
ax[0, 3].axis('off')
ax[1, 0].imshow(im1PH, cmap='gray')
ax[1, 0].set_title("Im1 PrewittH Kernel")
ax[1, 0].axis('off')
ax[1, 1].imshow(im1PV, cmap='gray')
ax[1, 1].set_title("Im1 PrewittV Kernel")
ax[1, 1].axis('off')
ax[1, 2].imshow(im1RH, cmap='gray')
ax[1, 2].set_title("Im1 RobertsH Kernel")
ax[1, 2].axis('off')
ax[1, 3].imshow(im1RV, cmap='gray')
ax[1, 3].set_title("Im1 RobertsV Kernel")
ax[1, 3].axis('off')
_, ax = plt.subplots(nrows=2, ncols=4, figsize=(18, 5))
ax[0, 0].imshow(im2SH, cmap='gray')
ax[0, 0].set_title("Im2 SobelSH Kernel")
ax[0, 0].axis('off')
ax[0, 1].imshow(im2SV, cmap='gray')
ax[0, 1].set_title("Im2 SobelV Kernel")
ax[0, 1].axis('off')
ax[0, 2].imshow(im2ScH, cmap='gray')
ax[0, 2].set_title("Im2 ScharrH Kernel")
ax[0, 2].axis('off')
ax[0, 3].imshow(im2ScV, cmap='gray')
ax[0, 3].set_title("Im2 ScharrV Kernel")
ax[0, 3].axis('off')
ax[1, 0].imshow(im2PH, cmap='gray')
ax[1, 0].set_title("Im2 PrewittH Kernel")
ax[1, 0].axis('off')
ax[1, 1].imshow(im2PV, cmap='gray')
ax[1, 1].set_title("Im2 PrewittV Kernel")
ax[1, 1].axis('off')
ax[1, 2].imshow(im2RH, cmap='gray')
ax[1, 2].set_title("Im2 RobertsH Kernel")
ax[1, 2].axis('off')
ax[1, 3].imshow(im2RV, cmap='gray')
ax[1, 3].set_title("Im2 RobertsV Kernel")
ax[1, 3].axis('off')
结果分析
-
Sobel:索贝尔滤波器对纹理复杂的图形性能较弱,边缘检测精度不够高。在图1的中心,sobel滤波器几乎无法检测到复杂纹理,因此可以看到图1梯度为比较暗的区域。
-
Scharr:对于Scharr滤波器,相邻像素的权值较大,因此精度更高,可以计算出比其他滤波器更小的梯度变化。它具有最好的检测精度,这就是为什么使用Scharr滤波器的图像是最亮的。另外我们可以看到主纹理周围有许多额外的渐变区域。
-
Prewitt:Prewitt滤波器与索贝尔滤波器相似,但它没有权重的概念,所以结果比索贝尔滤波器更差。
-
Roberts:罗伯特滤波器有最好的锐化效果,因为罗伯特滤波器很简单,计算量较少,对细节较敏感。所以边缘更细,整个带有罗伯特滤波器的图像看起来是最暗的。