[Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子

VSole2023-05-22 09:10:36

一.Scharr算子

由于Sobel算子在计算相对较小的核的时候,其近似计算导数的精度比较低,比如一个3x3的Sobel算子,当梯度角度接近水平或垂直方向时,其不精确性就越发明显。Scharr算子同Sobel算子的速度一样快,但是准确率更高,尤其是计算较小核的情景,所以利用3x3滤波器实现图像边缘提取更推荐使用Scharr算子。

Scharr算子又称为Scharr滤波器,也是计算x或y方向上的图像差分,在OpenCV中主要是配合Sobel算子的运算而存在的,其滤波器的滤波系数如下:

Scharr算子的函数原型如下所示,和Sobel算子几乎一致,只是没有ksize参数,其函数原型如下所示:

dst = Scharr(src, ddepth, dx,

  dy[, dst[, scale[, delta[, borderType]]]]])

  • src表示输入图像
  • dst表示输出的边缘图,其大小和通道数与输入图像相同
  • ddepth表示目标图像所需的深度,针对不同的输入图像,输出目标图像有不同的深度
  • dx表示x方向上的差分阶数,取值1或 0
  • dy表示y方向上的差分阶数,取值1或0
  • scale表示缩放导数的比例常数,默认情况下没有伸缩系数
  • delta表示将结果存入目标图像之前,添加到结果中的可选增量值
  • borderType表示边框模式,更多详细信息查阅BorderTypes

Python实现代码如下所示:


# -*- coding: utf-8 -*-import cv2  import numpy as np  import matplotlib.pyplot as plt #读取图像img = cv2.imread('lena.png')lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#灰度化处理图像grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Scharr算子x = cv2.Scharr(grayImage, cv2.CV_32F, 1, 0) #X方向y = cv2.Scharr(grayImage, cv2.CV_32F, 0, 1) #Y方向absX = cv2.convertScaleAbs(x)       absY = cv2.convertScaleAbs(y)Scharr = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
#用来正常显示中文标签plt.rcParams['font.sans-serif']=['SimHei']
#显示图形titles = [u'原始图像', u'Scharr算子']  images = [lenna_img, Scharr]  for i in xrange(2):     plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')     plt.title(titles[i])     plt.xticks([]),plt.yticks([])  plt.show()

运行结果如下图所示:


二.Canny算子

John F.Canny于1986年发明了一个多级边缘检测算法——Canny边缘检测算子,并创立了边缘检测计算理论(Computational theory of edge detection),该理论有效地解释了这项技术的工作理论。

边缘检测通常是在保留原有图像属性的情况下,对图像数据规模进行缩减,提取图像边缘轮廓的处理方式。

Canny算法是一种被广泛应用于边缘检测的标准算法,其目标是找到一个最优的边缘检测解或找寻一幅图像中灰度强度变化最强的位置。最优边缘检测主要通过低错误率、高定位性和最小响应三个标准进行评价。Canny算子的实现步骤如下:

1.使用高斯平滑(如公式所示)去除噪声。

2.按照Sobel滤波器步骤计算梯度幅值和方向,寻找图像的强度梯度。先将卷积模板分别作用x和y方向,再计算梯度幅值和方向,其公式如下所示。梯度方向一般取0度、45度、90度和135度四个方向。

3.通过非极大值抑制(Non-maximum Suppression)过滤掉非边缘像素,将模糊的边界变得清晰。该过程保留了每个像素点上梯度强度的极大值,过滤掉其他的值。

对于每个像素点,它进行如下操作:

  • 1)将其梯度方向近似为以下值中的一个,包括0、45、90、135、180、225、270和315,即表示上下左右和45度方向。
  • 2)比较该像素点和其梯度正负方向的像素点的梯度强度,如果该像素点梯度强度最大则保留,否则抑制(删除,即置为0)。其处理后效果如下图所示,左边表示梯度值,右边表示非极大值抑制处理后的边缘。

4.利用双阈值方法来确定潜在的边界。经过非极大抑制后图像中仍然有很多噪声点,此时需要通过双阈值技术处理,即设定一个阈值上界和阈值下界。图像中的像素点如果大于阈值上界则认为必然是边界(称为强边界,strong edge),小于阈值下界则认为必然不是边界,两者之间的则认为是候选项(称为弱边界,weak edge)。经过双阈值处理的图像如下图所示,左边为非极大值抑制处理后的边缘,右边为双阈值技术处理的效果图。

5.利用滞后技术来跟踪边界。若某一像素位置和强边界相连的弱边界认为是边界,其他的弱边界则被删除。

在OpenCV中,Canny()函数原型如下所示:

edges = Canny(image, threshold1,

  threshold2[, edges[, apertureSize[, L2gradient]]])

  • mage表示输入图像
  • edges表示输出的边缘图,其大小和类型与输入图像相同
  • threshold1表示第一个滞后性阈值
  • threshold2表示第二个滞后性阈值
  • apertureSize表示应用Sobel算子的孔径大小,其默认值为3
  • L2gradient表示一个计算图像梯度幅值的标识,默认值为false

Canny算子的边缘提取实现代码如下所示:


# -*- coding: utf-8 -*-import cv2  import numpy as np  import matplotlib.pyplot as plt #读取图像img = cv2.imread('lena.png')lenna_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#灰度化处理图像grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#高斯滤波降噪gaussian = cv2.GaussianBlur(grayImage, (3,3), 0) #Canny算子Canny = cv2.Canny(gaussian, 50, 150) 
#用来正常显示中文标签plt.rcParams['font.sans-serif']=['SimHei']
#显示图形titles = [u'原始图像', u'Canny算子']  images = [lenna_img, Canny]  for i in xrange(2):     plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')     plt.title(titles[i])     plt.xticks([]),plt.yticks([])  plt.show()

其运行结果如图所示:


三.LOG算子

LOG(Laplacian of Gaussian)边缘检测算子是David Courtnay Marr和Ellen Hildreth在1980年共同提出的,也称为Marr & Hildreth算子,它根据图像的信噪比来求检测边缘的最优滤波器。该算法首先对图像做高斯滤波,然后再求其拉普拉斯(Laplacian)二阶导数,根据二阶导数的过零点来检测图像的边界,即通过检测滤波结果的零交叉(Zero crossings)来获得图像或物体的边缘。

LOG算子该综合考虑了对噪声的抑制和对边缘的检测两个方面,并且把Gauss平滑滤波器和Laplacian锐化滤波器结合了起来,先平滑掉噪声,再进行边缘检测,所以效果会更好。该算子与视觉生理中的数学模型相似,因此在图像处理领域中得到了广泛的应用。它具有抗干扰能力强,边界定位精度高,边缘连续性好,能有效提取对比度弱的边界等特点。

常见的LOG算子是5*5模板,如下所示:

由于LOG算子到中心的距离与位置加权系数的关系曲线像墨西哥草帽的剖面,所以LOG算子也叫墨西哥草帽滤波器,如图所示。

LOG算子的边缘提取实现代码如下所示:


# -*- coding: utf-8 -*-import cv2  import numpy as np  import matplotlib.pyplot as plt #读取图像img = cv2.imread('lena.png')lenna_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#灰度化处理图像grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#先通过高斯滤波降噪gaussian = cv2.GaussianBlur(grayImage, (3,3), 0) #再通过拉普拉斯算子做边缘检测dst = cv2.Laplacian(gaussian, cv2.CV_16S, ksize = 3)LOG = cv2.convertScaleAbs(dst)
#用来正常显示中文标签plt.rcParams['font.sans-serif']=['SimHei']
#显示图形titles = [u'原始图像', u'LOG算子']  images = [lenna_img, LOG]  for i in xrange(2):     plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')     plt.title(titles[i])     plt.xticks([]),plt.yticks([])  plt.show()

其运行结果如下图所示:


四.总结代码

边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此需要采用滤波器来过滤噪声,并调用图像增强或阈值化算法进行处理,最后再进行边缘检测。

下面是采用高斯滤波去噪和阈值化处理之后,再进行边缘检测的过程,并对比了四种常见的边缘提取算法。


# -*- coding: utf-8 -*-import cv2  import numpy as np  import matplotlib.pyplot as plt
#读取图像img = cv2.imread('lena.png')lenna_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#灰度化处理图像grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#高斯滤波gaussianBlur = cv2.GaussianBlur(grayImage, (3,3), 0)
#阈值处理ret, binary = cv2.threshold(gaussianBlur, 127, 255, cv2.THRESH_BINARY)
#Scharr算子x = cv2.Scharr(grayImage, cv2.CV_32F, 1, 0) #X方向y = cv2.Scharr(grayImage, cv2.CV_32F, 0, 1) #Y方向absX = cv2.convertScaleAbs(x)       absY = cv2.convertScaleAbs(y)Scharr = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
#Canny算子gaussian = cv2.GaussianBlur(grayImage, (3,3), 0) #高斯滤波降噪Canny = cv2.Canny(gaussian, 50, 150) 
#LOG算子gaussian = cv2.GaussianBlur(grayImage, (3,3), 0) #先通过高斯滤波降噪dst = cv2.Laplacian(gaussian, cv2.CV_16S, ksize = 3) #再通过拉普拉斯算子做边缘检测LOG = cv2.convertScaleAbs(dst)
#效果图titles = ['Source Image', 'Gray Image', 'Binary Image',          'Scharr Image','Canny Image', 'LOG Image']  images = [lenna_img, grayImage, binary, Scharr, Canny, LOG]  for i in np.arange(6):     plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')     plt.title(titles[i])     plt.xticks([]),plt.yticks([])  plt.show()

输出结果如图所示。


希望这篇基础性文章对您有所帮助,如果有错误或不足之处,请海涵!考博加油。

边缘检测图像锐化
本作品采用《CC 协议》,转载必须注明作者和本文链接
Python图像处理第17篇介绍Scharr算子、Canny算子和LOG算子,希望您喜欢!
新型数据中心是以支撑经济社会数字转型、智能升级、融合创新为导向,以5G、工业互联网、云计算、人工智能等应用需求为牵引,汇聚多元数据资源、运用绿色低碳技术、具备安全可靠能力、提供高效算力服务、赋能千行百业应用的新型基础设施,具有高技术、高算力、高能效、高安全特征。随着新一代信息技术快速发展,数据资源存储、计算和应用需求大幅提升,传统数据中心正加速与网络、云计算融合发展,加快向新型数据中心演进。为统筹
Python图像处理第12篇介绍图像几何变换基础知识
交叉路口事故是车辆碰撞的第二大原因,仅次于追尾事故。错误识别的后果是严重的:将红灯识别为绿灯可能会导致交叉路口碰撞;将绿灯识别为红灯可能会强制停车并堵塞交通。在实际环境中进行了实验,并在连续帧中展示了对 40 多米外移动车辆的成功攻击。建议重新设计滚动快门以减轻威胁。否则,灯的状态将设置为黑色,表示状态不确定。未能相应停车可能会导致交叉路口事故。
HEAT使用多种技术,专门规避当前安全架构中多层机制的检测
Corsha公司基础设施主管Alex Meijer表示:“Kubernetes的供应链安全将得到更多的重视。”但这并不意味着他们的雇主必须遵守这一框架,特别是如果他们的行业或企业不需要这样做。Robertson认为,由于其深度和广度,NIST框架可能在2023年成为一个热门话题。2023年将是奠定基础的重要一年。人们普遍认为2023年可能会带来科技行业的整合和变革。
现有工作无法同时克服上述两种挑战。具体的,针对上述提到的两种挑战,我们对ChartStamp进行分析。进一步地,为了提升图表感知质量至更高的水平,我们考虑到同质平滑区域与高频纹理区域的感知差别,引入了平滑损失函数。具体来说,平滑损失函数首先对原始图表各区域的平滑程度进行评估,对变化平缓的区域赋予高惩罚权重,对变化剧烈的区域赋予低惩罚权重。最后,将基础平滑损失乘以对应的惩罚权重,得到最终的平滑损失函数。
人工智能的2024年
2024-01-02 14:09:39
步入2024年,人工智能的未来展现出前所未有的潜力。生成式人工智能时代超越了语言界限,拥抱多模式功能,重新定义了创新格局。由先进AI模型提供支持的AIOps和自主运营正在重塑组织管理IT基础设施的方式。生成式人工智能与特定行业的人工智能战略之间的共生关系,意味着一种全面利用人工智能全部潜力的方法。
今年有望成为勒索软件攻击成本第二高的一年,威胁参与者依赖于新的欺骗性社交工程方法和武器化的AI。最近的米高梅泄密事件始于攻击者研究服务台员工的社交媒体个人资料,然后打电话给服务台,冒充他们获得特权访问凭据和登录。
云隔离的梦想
2022-08-14 05:16:19
我有一个梦想
VSole
网络安全专家