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

article/2025/11/9 3:44:14

图像边缘一般指图像的灰度变化率最大的位置。成因主要如下:

1.图像灰度在表面法向变化不连续;

2.图像中物体在空间上的深度不一致;

3.在光滑的表面上颜色不一致;

4.图像中物体的光影



边缘检测指的是从图像中检测边缘点和边缘段,并且描述边缘方向的过程。图像可以看成二元函数f(x,y),(x,y)是pixel的位置,f(x,y)是该处的灰度值,这样图像就可以想象成是一个曲面。看作曲面以后,就可以用数学的方法来处理了。边缘即曲面上变化最剧烈的位置,这个位置也是曲面的局部极值点的位置,求极值大家都知道,可以用导数来求。

我们要做的一是找到边缘的位置,二是要确定边缘的方向,因为在描绘边缘的时候,要将相关的边缘连接成边缘线。


这里介绍的是用一阶微分算子来检测边缘。

求得图像的梯度场:

梯度的模值为:

梯度方向为:



方向导数与梯度具有如下关系:


由内积的计算方法可以得出:


由此我们得到,图像某一点(x,y)变化最快的方向是梯度的方向,变化最慢的方向是与梯度垂直的方向。


两个关键点:

1. 图像是离散的,微分算子也要离散化,我们用差分的方式去逼近微分,并将微分算子简化为模板;

2. 到底要不要把一个点看作边缘点,我们是通过设定一个阈值来判断的,微分后大于这个阈值,就判作边缘。


一个注意点:

导数是检测突变的地方,如果某处有噪声干扰,很容易误检,即一阶微分不能抵抗噪声。所以在使用一阶微分检测边缘之前,通常进行预处理抵抗噪声。



Roberts算子:

在(i+1/2,j+1/2)处差分

转化为模板即为      

对于所有的微分算子而言,若只对|Rxf|进行阈值判决,则选择的是与x方向垂直的边缘;若只对|Ryf|进行阈值判决,则选择的是与y方向垂直的边缘;若选择的是对|Rxf|+|Ryf| 进行判决,则获得一般方向的边缘。


Sobel算子

中心差分,对于水平线和垂直线的四个点权重高

模板为   

在实际运用中较多


Prewitt算子

模板为   


Kirsch算子

8个模板,对应8个方向,最大值被选出



Robinson算子

规则同上,也是8个模板




lenn原图:



把lenna的图像看成二元函数对应的曲面:



下面是在matlab上的检测效果:(图片如果太小,可以放大浏览器的页面)

1.Robets算子



2.Sobel算子



3.Prewitt算子



4.Kirsch算子



Sobel的代码:

lenna = imread('E:\ImageTest\512\g512_006\lena.pgm');
subplot(241)
imshow(lenna,[]);title('原图')%画三维曲面图
% x = 1:512;
% y = 1:512;
% [X,Y] = meshgrid(x,y);
% Z=double(lenna);
% mesh(X,Y,Z);lenna_1 = edge(lenna,'sobel',0.06); 
subplot(242)
imshow(lenna_1,[]);title('Sobel 0.06')lenna_2 = edge(lenna,'sobel',0.09); 
subplot(243)
imshow(lenna_2,[]);title('Sobel 0.09')lenna_3 = edge(lenna,'sobel',0.12); 
subplot(244)
imshow(lenna_3,[]);title('Sobel 0.12')sigma = 0.6;     
N = 5;            %滤波模板大小是(2N+1)×(2N+1)  
N_row = 2*N+1;  
gausFilter = fspecial('gaussian',[N_row N_row],sigma);  %高斯滤波模板
lenna_0=imfilter(lenna,gausFilter,'conv');
subplot(245)
imshow(lenna_0,[]);title('滤波后')lenna_4 = edge(lenna_0,'sobel',0.06); 
subplot(246)
imshow(lenna_4,[]);title('Sobel 0.06')lenna_5 = edge(lenna_0,'sobel',0.09); 
subplot(247)
imshow(lenna_5,[]);title('Sobel 0.09')lenna_6 = edge(lenna_0,'sobel',0.12); 
subplot(248)
imshow(lenna_6,[]);title('Sobel 0.12')

Kirsch的代码:

clear
clc
close all
bw1=imread('E:\ImageTest\512\g512_006\lena.pgm');%---------------------------------------------------------------
%对图象进行预处理figure(1)
imshow(bw1,[])
title('原始图象')%对图象进行均值滤波
bw2=filter2(fspecial('average',3),bw1);%对图象进行高斯滤波
bw3=filter2(fspecial('gaussian'),bw2);%利用小波变换对图象进行降噪处理
[thr,sorh,keepapp]=ddencmp('den','wv',bw3);     %获得除噪的缺省参数
bw4=wdencmp('gbl',bw3,'sym4',2,thr,sorh,keepapp);%图象进行降噪处理%---------------------------------------------------------------------
%提取图象边缘
t=[0.8 1.0 1.5 2.0 2.5].*10^5 ;     %设定阈值
bw5=double(bw4);            
[m,n]=size(bw5);             
g=zeros(m,n); 
d=zeros(1,8);
%利用Kirsch算子进行边缘提取
for i=2:m-1for j=2:n-1d(1) =(5*bw5(i-1,j-1)+5*bw5(i-1,j)+5*bw5(i-1,j+1)-3*bw5(i,j-1)-3*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2; d(2) =((-3)*bw5(i-1,j-1)+5*bw5(i-1,j)+5*bw5(i-1,j+1)-3*bw5(i,j-1)+5*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2; d(3) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)+5*bw5(i-1,j+1)-3*bw5(i,j-1)+5*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)+5*bw5(i+1,j+1))^2; d(4) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)-3*bw5(i,j-1)+5*bw5(i,j+1)-3*bw5(i+1,j-1)+5*bw5(i+1,j)+5*bw5(i+1,j+1))^2; d(5) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)-3*bw5(i,j-1)-3*bw5(i,j+1)+5*bw5(i+1,j-1)+5*bw5(i+1,j)+5*bw5(i+1,j+1))^2; d(6) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)+5*bw5(i,j-1)-3*bw5(i,j+1)+5*bw5(i+1,j-1)+5*bw5(i+1,j)-3*bw5(i+1,j+1))^2; d(7) =(5*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)+5*bw5(i,j-1)-3*bw5(i,j+1)+5*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2; d(8) =(5*bw5(i-1,j-1)+5*bw5(i-1,j)-3*bw5(i-1,j+1)+5*bw5(i,j-1)-3*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2;      g(i,j) = max(d);end
end %显示边缘提取后的图象
figure(5)
for k=1:5for i=1:mfor j=1:nif g(i,j)>t(k)bw5(i,j)=255;           elsebw5(i,j)=0;endendendsubplot(1,5,k)imshow(bw5,[])title(['Kirsch' '  ' num2str(t(k))])
end





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

相关文章

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算子更加明显。 其数学表…

图像边缘检测之Prewitt算子

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