[VP] Sobel, Scharr, Prewitt, Roberts四种滤波器的对比

Sobel, Scharr, Prewitt, Roberts


所用图像如下,使用时请自行更换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:罗伯特滤波器有最好的锐化效果,因为罗伯特滤波器很简单,计算量较少,对细节较敏感。所以边缘更细,整个带有罗伯特滤波器的图像看起来是最暗的。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Sobel、PrewittRoberts、LOG、Canny是常用的图像边缘检测算法,它们各有优缺点。 1. Sobel算法:Sobel算法是一种基于离散微分的边缘检测算法,它在图像噪声较小的情况下检测效果较好。Sobel算法的优点是计算简单,速度快,边缘定位准确,缺点是对图像噪声敏感,边缘方向垂直和水平的检测效果较好,对斜向边缘的检测效果较差。 2. Prewitt算法:Prewitt算法也是基于离散微分的边缘检测算法,它与Sobel算法类似,但是对斜向边缘的检测效果较好。Prewitt算法的优点是对斜向边缘的检测效果较好,缺点是对图像噪声敏感。 3. Roberts算法:Roberts算法是一种基于差分的边缘检测算法,它对图像噪声敏感,但是对斜向边缘的检测效果较好。Roberts算法的优点是对斜向边缘的检测效果较好,缺点是对图像噪声敏感。 4. LOG算法:LOG算法是一种基于高斯滤波和拉普拉斯变换的边缘检测算法,它对图像噪声不敏感,能够检测较细的边缘。LOG算法的优点是对图像噪声不敏感,检测效果较好,缺点是计算较复杂,速度较慢。 5. Canny算法:Canny算法是一种基于梯度的边缘检测算法,它能够检测到较细的边缘,对图像噪声不敏感,能够自适应选择阈值。Canny算法的优点是检测效果最好,能够检测到较细的边缘,对图像噪声不敏感,缺点是计算量较大,速度较慢。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是土豆大叔啊!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值