学习之边缘检测sobel,log,canny
来源:互联网 发布:大黄蜂视频加密软件 编辑:程序博客网 时间:2024/05/22 11:54
Edge detection is the name for aset of mathematical methods ,which aim atidentifyingpoints ina digital image at which the imagebrightness changessharplyor, more formally,has discontinuities.
边缘检测是图像处理和计算机视觉中常用的一种算子,其目标是找到图像中亮度变化剧烈的像素点集。在现实世界中,对应于图像中亮度变化剧烈的情况主要有:
(1)深度的不连续(物体处在不同的物平面上)
(2)表面方向的不连续(如正方体的不同的两个面)
(3)物体材料的不同(这样会导致光的反射系数不同)
(4)场景中光照不同(如被树荫投射的地面)
Sobel算子:是一阶导数的边缘检测算子,在算法实现过程中,通过3×3模板,根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。
clear;sourcePic=imread('5.bmp');%读取原图像grayPic=mat2gray(sourcePic);%转换成灰度图像[m,n]=size(grayPic);newGrayPic=grayPic;%为保留图像的边缘一个像素sobelNum=0;%经sobel算子计算得到的每个像素的值sobelThreshold=0.8;%设定阈值for j=2:m-1 for k=2:n-1 sobelNum=abs(grayPic(j-1,k+1)+2*grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)... -2*grayPic(j,k-1)-grayPic(j+1,k-1))+abs(grayPic(j-1,k-1)+2*grayPic(j-1,k)+... grayPic(j-1,k+1)-grayPic(j+1,k-1)-2*grayPic(j+1,k)-grayPic(j+1,k+1)); if(sobelNum>sobelThreshold) newGrayPic(j,k)=255; else newGrayPic(j,k)=0; end endendfigure,imshow(newGrayPic);title('Sobel算子的处理结果')
LoG算子:是David Courtnay Marr和Ellen Hildreth共同提出的。因此,也称为边缘检测算法或Marr & Hildreth算子。该算法首先对图像做高斯滤波,然后再求其拉普拉斯(Laplacian)二阶导数。
%log算法clear all;close all;clc;img=imread('7.bmp');imshow(img);mask=[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]; dx=imfilter(img,mask); grad=mat2gray(dx); figure,imshow(grad); BW=im2bw(grad,0.58);%用阈值(threshold)变换法把灰度图像(grayscale image)转换成二值图像figure,imshow(BW),title('log');Canny算法步骤
1 用高斯滤波器平滑图象;
2 用一阶偏导的有限差分来计算梯度的幅值和方向;
3 对梯度幅值进行非极大值抑制;
4 用双阈值算法检测和连接边缘。
%canny算法clear all;close all;clc;img=imread('6.jpg');imshow(img);[m n]=size(img);img=double(img);%% 高斯滤波w=fspecial('gaussian',[5 5]);img=imfilter(img,w,'replicate');figure,imshow(uint8(img))%% sobel边缘检测w=fspecial('sobel');img_w=imfilter(img,w,'replicate'); % 求横边缘w=w'; %矩阵转置img_h=imfilter(img,w,'replicate'); %求竖边缘img=sqrt(img_w.^2+img_h.^2);figure,imshow(uint8(img));title('sobel');%% 进行非极大抑制new_edge=zeros(m,n);for i=2:m-1 for j=2:n-1 Mx=img_w(i,j); My=img_h(i,j); if My~=0 %不等于 o=atan(Mx/My);%边缘的法线弧度 elseif My==0 && Mx>0 o=pi/2; else o=-pi/2; end %Mx处用My和img进行插值 adds=get_coords(o); M1=My*img(i+adds(2),j+adds(1))+(Mx-My)*img(i+adds(4),j+adds(3)); %插值后得到的像素,用此像素和当前像素比较 adds=get_coords(o+pi); %边缘法线另一侧求得的两点坐标,插值需要 M2=My*img(i+adds(2),j+adds(1))+(Mx-My)*img(i+adds(4),j+adds(3));%另一侧插值得到的像素,同样和当前像素比较 isbigger=(Mx*img(i,j)>M1)*(Mx*img(i,j)>=M2)+(Mx*img(i,j)<M1)*(Mx*img(i,j)<=M2);%如果当前点比两边点都大 if isbigger new_edge(i,j)=img(i,j); end endendfigure,imshow(uint8(new_edge)) %%下面是滞后阈值处理up=120; %上阈值low=100; %下阈值set(0,'RecursionLimit',10000); %设置最大递归深度for i=1:m for j=1:n if new_edge(i,j)>up &&new_edge(i,j)~=255 %判断上阈值 new_edge(i,j)=255; new_edge=connect(new_edge,i,j,low); end endendfigure;imshow(new_edge==255)
0 0
- 学习之边缘检测sobel,log,canny
- opencv3学习之边缘检测(Canny/Sobel/Laplacian算子)
- canny/Sobel/Laplace边缘检测
- [学习opencv]图像sobel、laplacian、canny边缘检测
- 数字图像处理成长之路7:边缘检测(sobel canny)
- 边缘检测:Canny边缘检测和sobel边缘检测比较
- 图像边缘检测Sobel,Laplace,Canny
- opencv边缘检测Sobel和Canny
- matlab sobel canny prewitt 边缘检测算子
- 基于Sobel和Canny边缘检测
- Android opencv(三) 边缘检测Sobel、Canny
- 几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny
- OpenCV学习之Canny边缘检测
- vim+python+OpenCV学习七 : Sobel算子、Laplacian算子和Canny边缘检测
- unity3d shader之Roberts,Sobel,Canny 三种边缘检测方法
- OpenCV之十二 OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
- 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑合辑
- OpenCV教程 之 边缘检测函数:Canny、Sobel、Scharr(C++)
- 写给2015年的自己
- hdu1429 胜利大逃亡(续) (BFS+状态压缩)
- 如何完成支付宝的支付功能?
- aapt.exe已停止运行 android.content.res.Resources$NotFoundException: String resource ID #0x0...
- Android Fragment 真正的完全解析(下)
- 学习之边缘检测sobel,log,canny
- 第16周项目1-1对字符串的操作将str1和str2连接,并将结果保存在str1中
- 第16周项目2去除第一个单词前的空格
- uboot启动阶段修改启动参数方法及分析
- 【前方高能,自备护镜】一堆乱而无序的东东......为UART(基于Z-stack)通信准备的资料
- Ubuntu各常用库名称
- php 连接redis 数据库单利类
- TI OMX 基础入门
- 第16周 项目1 运用指针排序