使用sobel、prewitt、拉普拉斯算子、差分法提取图像的边缘

article/2025/11/9 3:43:01

参考:
https://www.cnblogs.com/dengdan890730/p/6145585.html
https://blog.csdn.net/touch_dream/article/details/62447801
https://blog.csdn.net/xiahn1a/article/details/42141429
https://blog.csdn.net/swj110119/article/details/51777422

什么是边缘?

边缘一般是指图像中某一局部强度剧烈变化的区域。强度变化一般有2中情况,阶跃效应和屋顶效应。而边缘检测的任务就是找到具有阶跃变化或者屋顶变化的像素点的集合。

阶跃效应

那么什么是阶跃效应?
用图表示就是下图展示的那样,其中坐标轴的横轴表示空间变化,纵轴表示灰度变化,虚线表示边缘。
这里写图片描述

屋顶效应

这里写图片描述

边缘检测的原理

边缘检测基本原理:
既然边缘是灰度变化最剧烈的位置,最直观的想法就是求微分。
(1)对于第一种情况:一阶微分的峰值为边缘点,二阶微分的零点为边缘点。
具体来说,从阶跃效应的那张图可以看到边缘处的斜率(一阶导)最大,所以一阶微分的峰值是边缘点,而斜率是先增大后减小的,即边缘点的二阶导为0处。
(2)对于第二种情况:一阶微分的零点为边缘点,二阶微分的峰值为边缘点。

一阶导与二阶导提取边缘的差别

拉普拉斯提取边缘属于使用二阶导提取边缘,而sobel,prewitt,Roberts,差分法都是属于一阶导数求边缘。那么自然我们要问,一阶导数和二阶导数提取的边缘有什么不同呢?
(1)一阶导数通常会产生较粗的边缘。
(2)二阶导数对精细细节,如细线、孤立点和噪声有较强的响应。
(3)二阶导数在灰度斜坡和灰度台阶过渡处会产生双边沿响应。
(4)二阶导数的符号可以确定边缘的过渡是从亮到暗还是从暗到亮。
(5)二阶导数对细节更敏感。
一般的,提取边缘之前最好先做下图像平滑处理,因为导数对噪声比较敏感。

拉普拉斯算子提取边缘

拉普拉斯提取边缘属于使用二阶导提取边缘,它是一种各向同性的边缘提取算子。各向同性就是指使用这一个算子,就能对任何走向的界线和线条进行锐化,无方向性。而像sobel等,它们在提取x、y方向的边缘都是使用不同的算子来实现的。这拉普拉斯算子区别于其他一阶微分算子的优点。但是它的缺点相比较于一阶微分就是对噪声敏感。它对孤立像素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图像。正因为拉普拉斯算子对孤立点和噪声敏感。我们在使用拉普拉斯算子提取边缘之前,先使用高斯平滑图像,这一过程就是Laplacian-Gauss(LOG)算子。它把的高斯平滑滤波器和Laplacian锐化滤波器结合了起来,先平滑掉噪声,再进行边缘检测,所以效果会更好。
它的公式有2种表示形式,如下图,它们都是等价的。(1)这里写图片描述
其对应的矩阵形式如下:
这里写图片描述
————————————————————————————————————
(2)这里写图片描述
其对应的矩阵形式如下:
这里写图片描述
但是需要注意的是,将原图像与拉普拉斯二阶导数求得的图像合并的时候,必须考虑符号上的差别。也就是原图像和拉普拉斯二阶导求出的图像之间到底用加号还是减号,与中心点f(x,y)的系数有关。具体来说,如果中心像素前面的系数是负的,原图像就要减去拉普拉斯二阶导数图像。如果是正的,原图像就要加上拉普拉斯二阶导数图像。
倘若使用了中心系数为正,仍像中心系数为负的那样使用原图减去拉普拉斯算子卷积后的图像,你会发现图像会变得模糊。
此外在平时的使用中还有以下2种扩展形式的拉普拉斯算子。
这里写图片描述

拉普拉斯算子增强图像(matlab代码)

clc;
clear;
close all;% img = imread('images/lena_gray.jpg');
img = imread('images/lena.jpg');
img =im2double(img);
% 拉普拉斯算子形式1
% lapla =[0,-1,0;-1,4,-1;0,-1,0];
% 拉普拉斯算子形式2
lapla =[0,1,0;1,-4,1;0,1,0];
img_lapla = imfilter(img,lapla,'replicate','same');
figure;imshow(img_lapla);title('拉普拉斯');
% 使用形式1时要相加
% img_f = img +img_lapla;
% 使用形式2时要相减
img_f = img -img_lapla;
%使用下面的语句会使图像变得模糊而不是增强
%img_f = img +img_lapla;
figure;imshow(img_f);title('增强后');

sobel、prewitt、roberts算子

(1)roberts算子边缘定位准,但是对噪声敏感。适用于边缘明显且噪声较少的图像分割。同所有的一阶导数的算子一样,roberts产生的结果也是一个宽响应。roberts算子形式如下:
这里写图片描述
(2)prewitt算子对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波,低通滤波会造成高频的信息丢失,从而使图像模糊,无论这种程度或大或小,这种操作后的结果是存在的,所以Prewitt算子对边缘的定位不如Roberts算子。
这里写图片描述
(3)sobel算子是prewitt算子的改进形式,改进之处在于sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。正因为Sobel算子对于像素的位置的影响做了加权,与Prewitt算子、Roberts算子相比因此效果更好。相比较Prewitt算子,Sobel模板能够较好的抑制(平滑)噪声。 sobel要比prewitt更能准确检测图像边缘。
这里写图片描述

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
% % % 使用各种简单且常用的算子来进行边缘检测,需要明白的是
% % % 这些方法提取的都是粗略的边缘,还需要后处理,才能得到
% % % 更加准确的边缘。
% % % 
% % % 拉普拉兹算子是2阶微分算子,也就是说,相当于求取2次微分,
% % % 它的精度还算比较高,但对噪声过于敏感(有噪声的情况下效果很差)是它的重大缺点,
% % % 所以这种算子并不是特别常用.sobel算子是最常用的算子之一(它是一种一阶算子),
% % % 方法简单效果也不错,但提取出的边缘比较粗,要进行细化处理。
% % % 
% % % Sobel算子是在Prewitt算子的基础上改进的,在中心系数上使用一个权值2,
% % % 相比较Prewitt算子,Sobel模板能够较好的平滑噪声。 
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
clc;
clear;
close all;img = imread('images/lena.jpg');
img = im2double(img);
[height,width,ch] = size(img);
% if ch ==3
%     img = rgb2gray(img);
% end
%% 使用拉普拉斯算子提取边缘
lapla = [0,1,0;1,-4,1;0,1,0];
img_log = imfilter(img,lapla,'replicate','same');
figure;imshow(img_log);title('拉普拉斯');
%% 使用sobel算子
hx = fspecial('sobel');
imgx = imfilter(img,hx,'replicate','same');
hy = hx';
imgy = imfilter(img,hy,'replicate','same');
imgxy = sqrt(imgx.^2+imgy.^2);
figure;imshow(imgxy,[]);title('sobel提取边缘');
%% 使用prewitt算子
hx = fspecial('prewitt');
imgx = imfilter(img,hx,'replicate');
hy = hx';
imgy = imfilter(img,hy,'replicate');
imgxy = sqrt(imgx.^2+imgy.^2);
figure;imshow(imgxy,[]);title('prewitt算子提取边缘');
%% 使用差分
Ix = [diff(img,1,1);img(1,:,:)-img(end,:,:)];
Iy = [diff(img,1,2),img(:,1,:)-img(:,end,:)];
imgxy = sqrt(Ix.^2 + Iy.^2);
figure;imshow(imgxy,[]);title('差分法求边缘');

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

相关文章

图像边缘检测——一阶微分算子 Roberts、Sobel、Prewitt、Kirsch、Robinson(Matlab实现)

图像边缘一般指图像的灰度变化率最大的位置。成因主要如下: 1.图像灰度在表面法向变化不连续; 2.图像中物体在空间上的深度不一致; 3.在光滑的表面上颜色不一致; 4.图像中物体的光影 边缘检测指的是从图像中检测边缘点和边缘段…

python图像处理(十一)——图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子、Laplacian算子

在图像增强过程中,通常利用各类图像平滑算法消除噪声,图像的常见噪声主要有加性噪声、乘性噪声和量化噪声等。一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时图像边缘信息也主要集中在其高…

机器学习MATLAB实现:Matlab-梯度Roberts算子、拉普拉斯算子、Sobel算子、Prewitt算子对图像进行锐化

机器学习MATLAB实现:Matlab-梯度Roberts算子、拉普拉斯算子、Sobel算子、Prewitt算子对图像进行锐化 欢迎大家来到安静到无声的《模式识别与人工智能(程序与算法)》,如果对所写内容感兴趣请看模式识别与人工智能(程序与…

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

10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子 文章目录 10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子1 算法原理1.1 Sobel 算子1.2 Ro…

【计算机视觉】卷积、均值滤波、高斯滤波、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算子更加明显。 其数学表…