边缘提取算子

一阶:  Roberts算子、Sobel算子、Prewitt算子、Kirsch算子、Robinson算子

二阶: Laplacian算子、Canny算子、Marr-Hildreth(LoG算子)

Roberts 算子

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

转化为模板即为

Roberts算子,又称罗伯茨算子,是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子。他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。

Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。

Sobel算子

Sobel算法是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。

Prewitt算子

Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用。

其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。

Prewitt算子检测方法对灰度渐变和噪声较多的图像处理效果较好。但边缘较宽,而且间断点多。

对数字图像f(x,y),Prewitt算子的定义如下:

G(i)={[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]}

G(j)={[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]}

则P(i,j)=max[G(i),G(j)]或 P(i,j)=G(i)+G(j)

Kirsch算子

Kirsch算子是R.Kirsch提出来一种边缘检测算法,它采用8个3*3的模板对图像进行卷积,这8个模板代表8个方向,并取最大值作为图像的边缘输出,8个模板如下,它在保持细节和抗噪声方面都有较好的效果。

Robinson算子

规则同上,也是8个模板。

Laplacian算子

Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。

Laplacian 算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad的散度div。可使用运算模板来运算这定理定律。

函数的拉普拉斯算子也是该数的黑塞矩阵的迹,可以证明,它具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。

Laplacian 算子对噪声比较敏感,所以图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian 算子和平滑算子结合起来生成一个新的模板。

如果邻域系统是4 邻域,Laplacian 算子的模板为:

如果邻域系统是8 邻域,Laplacian 算子的模板为:

Canny算子

Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。

优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

该算子效果较好,但是它实现起来较为麻烦,Canny算子是一个具有滤波,增强,检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连接边缘。

Canny边缘检测算法

step1: 用高斯滤波器平滑图象;

step2: 用一阶偏导的有限差分来计算梯度的幅值和方向;

step3: 对梯度幅值进行非极大值抑制

step4: 用双阈值算法检测和连接边缘

参考:

https://blog.csdn.net/fengye2two/article/details/79190759

https://blog.csdn.net/jiachen0212/article/details/80078685

https://www.cnblogs.com/zhuifeng-mayi/p/9563947.html

https://www.cnblogs.com/techyan1990/p/7291771.html

Marr-HildrethLoG算子

LoG可以看成是一个高斯模板的拉普拉斯变换   Laplace of Gaussian

(图像的高斯拉普拉斯(LoG),可利用差分高斯(DoG)近似)

参考:

好:LOG高斯-拉普拉斯算子 https://blog.csdn.net/touch_dream/article/details/62237018

DoG算子和LoG算子 https://blog.csdn.net/dreamguard/article/details/83988814

好:LoG算子 https://blog.csdn.net/songzitea/article/details/12851079

LOG边缘检测--Marr-Hildreth边缘检测算法 https://blog.csdn.net/bettyshasha/article/details/51757185

好:SIFT特征点检测,特征点描述,特征点匹配理解 https://blog.csdn.net/ds0529/article/details/79617619

matlab代码

matlab自带edge函数

matlab中edge函数提供了很多算子,函数原型和算子包括:

matlab自带edge函数 使用代码:

clear;clc;%读取图像
I=imread('Lena512.png');
%I=rgb2gray(I);
figure;imshow(I,[]);title('Original Image');%sobel----------------------
sobelBW = edge(I,'sobel',0.06);  %可以省去0.06,系统会默认。
figure;imshow(sobelBW,[]);title('Sobel 0.06')%roberts----------------------
robertsBW=edge(I,'roberts');
figure;imshow(robertsBW);title('Roberts Edge');%prewitt----------------------
prewittBW=edge(I,'prewitt');
figure;imshow(prewittBW);title('Prewitt Edge');%Laplacian----------------------
logBW=edge(I,'log');
figure;imshow(logBW);title('Laplasian of Gaussian Edge');%canny----------------------
cannyBW=edge(I,'canny');
figure;imshow(cannyBW);title('Canny Edge');%高斯滤波 再 canny ----------------------
h=fspecial('gaussian',5);%高斯滤波
I2=imfilter(I,h,'replicate');
GcannyBW=edge(I2,'canny');%高斯滤波后使用Canny算子进行边缘检测
figure;imshow(GcannyBW);title('Gaussian & Canny Edge');

非matlasb自带 :梯度法、roberts算子、prewitt算子、sobel算子、krisch算子、LoG算子

%% 非matlasb自带 :梯度法、roberts算子、prewitt算子、sobel算子、krisch算子、LoG算子
clear;clc;close all
f=imread('Lena512.png');
T=20;%阈值
[m,n]=size(f);
%------梯度法-------
f_g=zeros(m,n);
for i=2:m-1for j=2:n-1f_g(i,j)=abs(f(i+1,j)-f(i,j))+abs(f(i,j+1)-f(i,j));if f_g(i,j)<Tf_g(i,j)=0;elsef_g(i,j)=255;endend
end
figure(1);
subplot(2,3,1);imshow(uint8(f_g));title('梯度法');
%------roberts算子-------
f_r=zeros(m,n);
for i=2:m-1for j=2:n-1f_r(i,j)=abs(f(i+1,j+1)-f(i,j))+abs(f(i,j+1)-f(i+1,j));if f_r(i,j)<Tf_r(i,j)=0;elsef_r(i,j)=255;endend
end
%f_r=imbinarize(imfilter(f,r),T);
subplot(2,3,2);imshow(uint8(f_r));title('Roberts算子');%------prewitt算子-------
f_p=zeros(m,n);
for i=2:m-1for j=2:n-1f_p(i,j)=abs(f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)-f(i-1,j+1)-f(i,j+1)-f(i+1,j+1))+abs(f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)-f(i-1,j-1)-f(i-1,j)-f(i-1,j+1));if f_p(i,j)<15f_p(i,j)=0;elsef_p(i,j)=255;endend
end
subplot(2,3,3);imshow(uint8(f_p));title('Prewitt算子');%------sobel算子-------
f_s=zeros(m,n);
for i=2:m-1for j=2:n-1f_s(i,j)=abs(f(i-1,j-1)+2*f(i,j-1)+f(i+1,j-1)-f(i-1,j+1)-2*f(i,j+1)-f(i+1,j+1))+abs(f(i+1,j-1)+2*f(i+1,j)+f(i+1,j+1)-f(i-1,j-1)-2*f(i-1,j)-f(i-1,j+1));if f_s(i,j)<Tf_s(i,j)=0;elsef_s(i,j)=255;endend
end
subplot(2,3,4);imshow(uint8(f_s));title('Sobel算子');%------krisch算子-------
k(:,:,1)=[-3,-3,-3;-3,0,5;-3,5,5];
k(:,:,2)=[-3,-3,5;-3,0,5;-3,-3,5];
k(:,:,3)=[-3,5,5;-3,0,5;-3,-3,-3];
k(:,:,4)=[-3,-3,-3;-3,0,-3;5,5,5];
k(:,:,5)=[5,5,5;-3,0,-3;-3,-3,-3];
k(:,:,6)=[-3,-3,-3;5,0,-3;5,5,-3];
k(:,:,7)=[5,-3,-3;5,0,-3;5,-3,-3];
k(:,:,8)=[5,5,-3;5,0,-3;-3,-3,-3];
kk=zeros(size(f));
I=double(f);
for i=1:8f_k(:,:,i)=conv2(I,k(:,:,i),'same');kk=max(kk,f_k(:,:,i));
end
f_kk=imbinarize(kk,600);
subplot(2,3,5);imshow(f_kk);title('Krisch算子');%------LoG算子-------
log1=[0 0 -1 0 0;0 -1 -2 -1 0;-1 -2 16 -2 -1;0 -1 -2 -1 0;0 0 -1 0 0];f_l=conv2(f,log1,'same');
f_ll=imbinarize(abs(f_l),300);
subplot(2,3,6);imshow(f_ll);title('LoG算子');

非matlab自带   Kirsch算子

(参考https://blog.csdn.net/u014485485/article/details/78339420)

clear;clc;close all%读取图像
bw1=imread('Lena512.png');
%bw1=rgb2gray(bw1);
figure;imshow(bw1,[]);title('Original Image');%均值滤波
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(2)
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

最后我之前自己写的梯度法:

I=imread('1.jpg');
I=rgb2gray(I);
T=10;%阈值
[x,y]=gradient(double(I));   %获取梯度
t=sqrt(x.^2+y.^2);
I(t>=T)=255;           %梯度提取边缘 画黑
I(t<T)=0;
I=uint8(I);
imshow(I);imwrite(I,'my开方梯度.jpg');  %保存图像到当前目录

本人水平有限,难免有错误疏漏,还望大佬多多批评指正。

图像处理:边缘提取算法(边缘提取算子总结)——Matlab代码实现相关推荐

  1. 灰狼(GWO)算法(附完整Matlab代码,可直接复制)

    尊重他人劳动成果,请勿转载! 有问题可留言或私信,看到了都会回复解答! 其他算法请参考: 1.粒子群(PSO)优化算法(附完整Matlab代码,可直接复制)https://blog.csdn.net/ ...

  2. 粒子群(PSO)算法(附完整Matlab代码,可直接复制)

    在粒子群优化算法中,每个解可用一只鸟(粒子)表示,目标函数就是鸟群所需要寻找的食物源.寻找最优解的过程中,粒子包含两种行为:个体行为和群体行为. 个体行为:粒子根据自身在寻优过程中的最优解更新自己的位 ...

  3. 25-混合A星算法Hybrid_Astar路径规划MATLAB代码

    资源: Hybrid-Astar(混合A星算法)路径规划MATLAB代码-电子商务文档类资源-CSDN文库 主要内容: 以车辆的运动学模型为节点,以当前点到终点的Astar距离和RS距离两者最大的距离 ...

  4. 多尺度结构元素形态学边缘检测算法的研究-含Matlab代码

    目录 一.引言 二.数学形态学理论概述 三.实验验证 四.参考文献 五.Matlab代码获取 一.引言 使用数字图像处理技术来解决计算机视觉.人工智能.生物遥感器视觉等领域所涉及到的图像问题时,最重要 ...

  5. a*算法matlab代码_NSGAII多目标优化算法讲解(附MATLAB代码)

    小编今天为大家讲解NSGA-II多目标优化算法,提到多目标优化,大家可能第一个就想到NSGA-II算法,今天小编就带领大家解开NSGA-II的神秘面纱. NSGA-II全称是快速非支配排序遗传算法,这 ...

  6. 【路径规划-TSP问题】基于粒子群结合蚁群算法求解旅行商问题附matlab代码

    1 内容介绍 一种基于粒子群优化的蚁群算法求解TSP问题的方法.该方法在求解TSP问题时,利用粒子群优化的思想,对蚁群算法的参数取值进行优化并选择.在粒子群算法中,将蚁群算法的5个参数(q,α,β,ρ ...

  7. Dijkstra算法和Floyd算法详解(MATLAB代码)

    一.Dijkstra算法 1.算法简介 Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式,是目前公认的最好的求解最短路径的方法.算法解决的是有 ...

  8. 【优化求解】基于多元宇宙MVO算法求解多目标matlab代码

    1 简介 MVO算法源于多元宇宙理论,该理论认为:多元宇宙源于宇宙大爆炸,每一个宇宙都存在一个膨胀率使其膨胀,宇宙间存在黑洞和白洞,黑洞引力很大能够通过虫洞链接到另一个时空,黑洞会吸入所有物质甚至光, ...

  9. 免疫算法(IA)MatLab代码详解

    CSDN编辑器里面没有MATLAB选项,所以我为了注释更清楚,用的是//,大家不要被误解了呀,算法看代码就好了 1 免疫算法的精髓 生物免疫系统:动态性免疫.自适应免疫 免疫算法-保证信息的无害性.有 ...

最新文章

  1. 【问题解决方案】ImportError: No module named ‘openpyxl‘/‘xlrd’
  2. LaTex 并集交集等
  3. 什么是计算机独立显卡,独立显卡是什么
  4. Java怎么使用spring定时器_浅析spring定时器的使用
  5. 如何在站点静态文件下查找某关键字并修改文件名?
  6. ai无法启动产品_启动AI启动的三个关键教训
  7. 【开源框架】:解决方案级别的代码生成器 WebFirst
  8. java -jar 默认参数_JAVA入门学习指南,建议收藏
  9. ubuntu ssh 登录日志_全球第一开源ERP Odoo操作手册 安装ssh服务和ssh客户端
  10. Android -- Messager与Service
  11. python网络编程百度云_python网络编程.mobi
  12. Winform UI界面设计例程——ListView控件
  13. Autoit 打开文件的几种方式(run/Fileopen/ShellExecute)
  14. 单端正激(Forward)变换器的工作原理CCM模式下电路设计参数计算
  15. 记录一次接入Unity IAP Tapjoy 等SDK的过程,坑了一周,快吐血了
  16. java读取地址栏参数(id=123name=xiaoxiao)
  17. 计算机编程导论python程序设计答案-计算机科学与Python编程导论_学堂云答案
  18. 微软亚太研发集团2013招聘
  19. 设计黄金法则永不改变
  20. 从微信小程序到QQ小程序:云开发CloudBase的一云多端实践

热门文章

  1. SD-WAN如何安装在企业WAN中?—Vecloud
  2. 在UWP的按钮中使用Segoe MDL2 Assets图标
  3. 达尔文流媒体服务器(Darwin Streaming Server)(DSS)并发性能测试报告
  4. 在SLES-11-SP1-i586上搭建apache+php环境
  5. ASP.NET比较常用的26个性能优化技巧
  6. mysql 四 表操作
  7. ORACLE查询删除重复记录
  8. 支付宝支付框js代码
  9. webservice客户端开发
  10. ARM常用的调试方式与ARM培训班常见的调试方法