10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子

article/2025/11/9 3:39:48

10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子

文章目录

  • 10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子
    • 1 算法原理
      • 1.1 Sobel 算子
      • 1.2 Roberts 算子
      • 1.3 拉普拉斯(Laplacian) 算子
      • 1.4 Canny 算法
      • 1.5 Prewitt 算子
      • 1.6 高斯拉普拉斯算子(LOG 算子)
    • 2 代码
    • 3 效果

1 算法原理

图像边缘是图像最基本的特征,所谓边缘(Edge) 是指图像局部特性的不连续性。灰度或结构等信息的突变处称之为边缘。例如,灰度级的突变、颜色的突变,、纹理结构的突变等。边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。图像的边缘有方向和幅度两种属性。边缘通常可以通过一阶导数或二阶导数检测得到。一阶导数是以最大值作为对应的边缘的位置,而二阶导数则以过零点作为对应边缘的位置。

边缘检测算子分类

一阶导数的边缘算子

通过模板作为核与图像的每个像素点做卷积和运算,然后选取合适的阈值来提取图像的边缘。常见的有 Roberts 算子、Sobel 算子和 Prewitt 算子。

二阶导数的边缘算子依据于二阶导数过零点,常见的有 Laplacian 算子,此类算子对噪声敏感。

其他边缘算子

前面两类均是通过微分算子来检测图像边缘,还有一种就是 Canny 算子,其是在满足一定约束条件下推导出来的边缘检测最优化算子。

1.1 Sobel 算子

Sobel 算子是一种用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导。该算子用于计算图像明暗程度近似值,根据图像边缘旁边明暗程度把该区域内超过某个数的特定点记为边缘。Sobel 算子在 Prewitt 算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。

Sobel 算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息。因为 Sobel 算子结合了高斯平滑和微分求导(分化),因此结果会具有更多的抗噪性,当对精度要求不是很高时,Sobel 算子是一种较为常用的边缘检测方法。

Sobel 算子的边缘定位更准确,常用于噪声较多、灰度渐变的图像。其算法模板如下面的公式所示,其中 dx 表示水平方向,dy 表示垂直方向。

image-20210808215835555

1.2 Roberts 算子

Roberts 算子又称为交叉微分算法,它是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条。常用来处理具有陡峭的低噪声图像,当图像边缘接近于正 45 度或负 45 度时,该算法处理效果更理想。其缺点是对边缘的定位不太准确,提取的边缘线条较粗。Roberts 算子的模板分为水平方向和垂直方向,如下式所示,从其模板可以看出,Roberts 算子能较好的增强正负 45 度的图像边缘。

image-20210808215851665

在 Python 中,Roberts 算子主要通过 numpy 定义模板,再调用 OpenCV 的 filter2D() 函数实现边缘提取。该函数主要是利用内核实现对图像的卷积运算。

1.3 拉普拉斯(Laplacian) 算子

拉普拉斯(Laplacian) 算子是 n 维欧几里德空间中的一个二阶微分算子,常用于图像增强领域和边缘提取。它通过灰度差分计算邻域内的像素。算法基本流程为:

  1. 判断图像中心像素灰度值与它周围其他像素的灰度值,如果中心像素的灰度更高,则提升中心像素的灰度;反之降低中心像素的灰度,从而实现图像锐化操作;

  2. 在算法实现过程中,Laplacian 算子通过对邻域中心像素的四方向或八方向求梯度,再将梯度相加起来判断中心像素灰度与邻域内其他像素灰度的关系;

  3. 最后通过梯度运算的结果对像素灰度进行调整。

1.4 Canny 算法

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

  1. 去噪声:应用高斯滤波来平滑图像,目的是去除噪声;

  2. 梯度:找寻图像的梯度;

  3. 非极大值抑制:应用非最大抑制技术来过滤掉非边缘像素,将模糊的边界变得清晰。该过程保留了每个像素点上梯度强度的极大值,过滤掉其他的值;

  4. 应用双阈值的方法来决定可能的(潜在的)边界;

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

1.5 Prewitt 算子

Prewitt 算子是一种图像边缘检测的微分算子,其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。由于 Prewitt 算子采用 33 模板对区域内的像素值进行计算,而 Robert 算子的模板为 22,故 Prewitt 算子的边缘检测结果在水平方向和垂直方向均比 Robert 算子更加明显。Prewitt 算子适合用来识别噪声较多、灰度渐变的图像,其计算公式如下所示:

image-20210808220047293

在 Python 中,Prewitt 算子的实现过程与 Roberts 算子比较相似。通过 Numpy定义模板,再调用 OpenCV 的 filter2D() 函数实现对图像的卷积运算,最终通过 convertScaleAbs() 和 addWeighted() 函数实现边缘提取。

1.6 高斯拉普拉斯算子(LOG 算子)

高斯拉普拉斯算子(LOG 算子):是高斯和拉普拉斯的双结合,即集平滑和边沿于一身的算子模型。LoG 算子是由拉普拉斯算子改进而来。拉普拉斯算子是一个单纯的二阶导数算子,是一个标量,具有线性、位移不变性,其传函在频域空间的原点为 0。所有经过拉普拉斯算子滤波的图像具有零平均灰度。但是该算子的缺点是 对噪声具有无法接受的敏感性,因此在实际应用中,一般先要对图像进行平滑滤波,再用拉氏算子进行图像的边缘检测。这就是 LOG 算子的产生的背景(最后的梯度表达式为 高斯函数和原图像卷积,再去二阶微分算子)。以 0 为中心,高斯标准差为 σ 的二维的 LOG 函数的表达式如下所示:

image-20210808220118685

2 代码

运行代码说明

1.要改变代码中的图片地址(地址不能有中文)

更改put(path)函数中的路径put(r'../image/image1.jpg')

2.注意最后的plt.savefig('1.new.jpg')是保存plt图像,如果不使用可以注释掉

代码依赖包:

matplotlib  3.4.2
numpy  1.20.3
opencv-python  4.1.2.30
# pip安装
pip install matplotlib numpy opencv-python
import cv2
import numpy as np
import matplotlib.pyplot as pltdef put(path):# 读取图像img = cv2.imread(path)b, g, r = cv2.split(img)img2 = cv2.merge([r, g, b])# 灰度化处理图像grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 高斯滤波gaussianBlur = cv2.GaussianBlur(grayImage, (3, 3), 0)# 二值化ret, binary = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY)# Sobel算子x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0)  # 对x求一阶导y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1)  # 对y求一阶导absX = cv2.convertScaleAbs(x)absY = cv2.convertScaleAbs(y)Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)# Roberts算子kernelx = np.array([[-1, 0], [0, 1]], dtype=int)kernely = np.array([[0, -1], [1, 0]], dtype=int)x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)# 转uint8absX = cv2.convertScaleAbs(x)absY = cv2.convertScaleAbs(y)Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)# 拉普拉斯算子dst = cv2.Laplacian(grayImage, cv2.CV_16S, ksize=3)Laplacian = cv2.convertScaleAbs(dst)# 高斯滤波降噪gaussian = cv2.GaussianBlur(grayImage, (5, 5), 0)# Canny算子Canny = cv2.Canny(gaussian, 50, 150)# Prewitt算子kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)# 转uint8absX = cv2.convertScaleAbs(x)absY = cv2.convertScaleAbs(y)Prewitt = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)# 高斯拉普拉斯算子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']# 显示图形plt.subplot(241), plt.imshow(img2), plt.title('原始图像'), plt.axis('off')plt.subplot(242), plt.imshow(binary, plt.cm.gray), plt.title('二值图'), plt.axis('off')plt.subplot(243), plt.imshow(Sobel, plt.cm.gray), plt.title('Sobel算子'), plt.axis('off')plt.subplot(244), plt.imshow(Roberts, plt.cm.gray), plt.title('Roberts算子'), plt.axis('off')plt.subplot(245), plt.imshow(Laplacian, plt.cm.gray), plt.title('拉普拉斯算子'), plt.axis('off')plt.subplot(246), plt.imshow(Canny, plt.cm.gray), plt.title('Canny算子'), plt.axis('off')plt.subplot(247), plt.imshow(Prewitt, plt.cm.gray), plt.title('Prewitt算子'), plt.axis('off')plt.subplot(248), plt.imshow(LOG, plt.cm.gray), plt.title('高斯拉普拉斯算子'), plt.axis('off')# plt.savefig('1.new-2.jpg')plt.show()# 图像处理函数,要传入路径
put(r'../image/image3.jpg')

3 效果

image-20210808220308754


http://chatgpt.dhexx.cn/article/XxSPR1Od.shtml

相关文章

【计算机视觉】卷积、均值滤波、高斯滤波、Sobel算子、Prewitt算子(Python实现)

##1.环境的搭建 Python 3.6OpenCV Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、MacOS操作…

几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny

from:https://blog.csdn.net/gdut2015go/article/details/46779251 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。这些包括:深度上的…

prewitt算子实现

原理&#xff1a; 实现&#xff1a; /*** description: prewitt算子* param src 输入图像* param dst 输出图像*/ void prewitt(cv::Mat& src, cv::Mat& dst) {cv::Mat getPrewitt_horizontal (cv::Mat_<float>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, …

数字图像处理——Sobel算子锐化、Prewitt算子锐化

数字图像处理——Sobel算子锐化、Prewitt算子锐化 一、Sobel算子锐化 %函数名称为Image_Sobel,输入参数Image,输出参数IMAGE function [IMAGE] Image_Sobel(Image) %获取矩阵的行、列、波段数 [m,n,bands] size(Image); %定义模板大小&#xff0c;假设模板大小33 A 1; %定义…

Python 图像处理 OpenCV (12): Roberts 算子、 Prewitt 算子、 Sobel 算子和 Laplacian 算子边缘检测技术

前文传送门&#xff1a; 「Python 图像处理 OpenCV &#xff08;1&#xff09;&#xff1a;入门」 「Python 图像处理 OpenCV &#xff08;2&#xff09;&#xff1a;像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python 图像处理 OpenCV &#xff08;3&#xff09;&…

[Python从零到壹] 五十七.图像增强及运算篇之图像锐化Roberts、Prewitt算子实现边缘检测

欢迎大家来到“Python从零到壹”&#xff0c;在这里我将分享约200篇Python系列文章&#xff0c;带大家一起去学习和玩耍&#xff0c;看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解&#xff0c;真心想把自己近十年的编程经验分享给大家&#xff0c;希望…

Prewitt算子计算图像梯度

Prewitt算子是一阶微分算子的边缘检测&#xff0c;利用像素点上下、左右邻点的灰度差&#xff0c;在边缘处达到极值检测边缘&#xff0c;去掉部分伪边缘&#xff0c;对噪声具有平滑作用。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成&#xff0c;这两个方向模板…

opencv-6 边缘检测(Prewitt算子,Sobel算子,Laplacian算子)

Roberts filter2D形式实现 import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread(lena.jpg) lenna_img cv2.cvtColor(img,cv2.COLOR_BGR2RGB) grayImage cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)kernelx np.array([[-1,0],[0,1]],dtypeint) kernely…

梯度与Roberts、Prewitt、Sobel、Lapacian算子

一、学习心得&#xff1a; 学习图像处理的过程中&#xff0c;刚开始遇到图像梯度和一些算子的概念&#xff0c;这两者到底是什么关系&#xff0c;又有什么不同&#xff0c;一直困扰着我。后来在看到图像分割这一模块后才恍然大悟&#xff0c;其实图像的梯度可以用一阶导数和二…

【计算机视觉】图像分割与特征提取——基于Roberts、Prewitt、Sobel算子的图像分割实验

个人简介&#xff1a; > &#x1f4e6;个人主页&#xff1a;赵四司机 > &#x1f3c6;学习方向&#xff1a;JAVA后端开发 > ⏰往期文章&#xff1a;SpringBoot项目整合微信支付 > &#x1f514;博主推荐网站&#xff1a;牛客网 刷题|面试|找工作神器 > &#…

边缘检测——Prewitt算子

垂直水平方向边缘 垂直水平方向的Prewitt算子是可分离的卷积核。 45、135方向边缘 算子不可分割。 缺点 没有充分利用边缘的梯度方向最后输出的边缘二值图&#xff0c;只是简单地利用阈值进行处理。如果阈值过大&#xff0c;则会损失很多边缘信息&#xff1b;如果阈值过…

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子)

目录 1 边缘检测的基本原理 2 边缘检测算子分类 3 梯度 3.1 图像梯度 3.2 梯度算子 4 Roberts 算子 4.1 基本原理 4.2 代码示例 5 Prewitt 算子 5.1 基本原理 5.2 代码示例 6 Sobel 算子 6.1 基本原理 6.2 代码示例 7 Laplacian 算子 7.1 基本原理 7.2 代码示…

python数字图像处理——边缘检测算子(Laplacian算子、Roberts算子、Prewitt算子和Sobel算子)

1.Laplacian算子 拉普拉斯&#xff08;Laplacian&#xff09;算子是n维欧几里德空间中的一个二阶微分算子&#xff0c;常用于图像增强领域和边缘提取。它通过灰度差分计算邻域内的像素&#xff0c;基本流程是&#xff1a;判断图像中心像素灰度值与它周围其他像素的灰度值&…

Prewitt算子边缘检测原理及实现

写在前面 Prewitt算子同样也是一种一阶微分算子&#xff0c;利用像素点上下左右邻点灰度差&#xff0c;在边缘处达到极值检测边缘&#xff0c;对噪声具有平滑的作用。 原理 其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的&#xff0c;这两个方向模板一个检测…

Prewitt和Sobel算子

在3*3模板中&#xff1a; 我如下定义水平、垂直和两对角线方向的梯度&#xff1a; 该定义下的算子称之为Prewitt算子&#xff1a; Sobel算子是在Prewitt算子的基础上改进的&#xff0c;在中心系数上使用一个权值2&#xff0c;相比较Prewitt算子&#xff0c;Sobel模板能够较好…

Prewitt边缘检测算子

Prewitt算子也是一种一阶微分算子&#xff0c;用于边缘检测。与Robert使用22的模板不同&#xff0c;Prewitt算子使用的是33的模板&#xff0c;利用像素点上下、左右邻点的灰度差来检测边缘&#xff0c;故其边缘检测结果在水平方向和垂直方向均比Robert算子更加明显。 其数学表…

图像边缘检测之Prewitt算子

Prewitt 算子 1. 原理 Prewitt算子是一种图像边缘检测的微分算子&#xff0c;其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。由于Prewitt算子采用 3x3 模板对区域内的像素值进行计算&#xff0c;而Robert算子的模板为 2x2&#xff0c;故Prewitt算子的边缘检测结果…

华为--配置本地环回接口地址

该实验紧接上一节实验 网络拓扑图如下 AR1环回接口配置 AR2环回接口配置 AR3环回接口配置 配置AR1回环接口路由 配置AR2回环接口路由 配置AR3回环接口路由 在AR1上测试回环接口的连通性 在AR2上测试回环接口的连通性 在AR3上测试回环接口的连通性 测试成功 转载于:https://my.o…

【LINUX】ifconfig只有本地环回地址问题的解决方法

问题描述&#xff1a; ifconfig只有lo&#xff0c;没有看到ens33 ifconfig -a看到了ens33&#xff0c;但是没有地址 解决方法&#xff1a; &#xff08;1&#xff09;stop network-manager sudo service network-manager stop &#xff08;2&#xff09;删除旧有的网络配置…

怎么判断一个ipv4地址是 私有地址,环回地址,实验地址,TEST-NET地址,本地链路地址?

问题的提出&#xff1a; 理论讲解(黄色的为上题的答案&#xff09;&#xff1a; IP地址分为五类&#xff1a; A类保留给政府机构&#xff0c;B类分配给中等规模的公司&#xff0c;C类分配给任何需要的人&#xff0c;D类用于组播&#xff0c;E类用于实验&#xff0c;各类可容纳…