边缘检测
实验表明,人眼对图像中边缘的识别不是通过设置阈值来分割的,目标的边缘一般表现为灰度(对彩色图像还包括色度)的特变。对于人类的视觉感知,图像边缘对理解图像内容起到关键作用。在灰度渐变的图像中无法区分其灰度变化的边界,但如果边界灰度有突变,则可以区分两个灰度不同的区域。这是基于灰度不连续性进行的分割方法。常见的边缘有:阶跃边缘、有干扰的渐变边缘、灰度变化率突变的边缘、窄带脉冲边缘······
边缘的含义体现在灰度的突变上。使用差分、梯度、拉普拉斯算子及各种高通滤波处理方法可以对图像边缘进行增强,只要再进行一次阈值处理,便可以将边缘增强的方法用于边缘检测。但是需要注意的是,对边缘处理的目的已经不是对整幅图像的边缘进行加强,而是根据边缘来进行图像分割。边缘检测要按照图像的内内容和应用的要求进行,可以先对图像做预处理,使边缘突出,然后选择合适的阈值进行分割。
MATLAB 边缘检测的函数为
BW=edge(I,'edge-finding methods ',THRESH, DIRECTION/SIGMA)
其中,I为灰度图像,BW 为返回的相同大小的二值图像。若检测到边沿则返回 1,否则返回 0。
edge 函数支持6种不同的边缘检测方法。'sobel'指定 Sobel 方法,'prewitt'指定 Prewitt 方法,'roberts'指定 Roberts 方法,'log'指定 LoG 方法(高斯-拉普拉斯算子),'zerocross'指定(零交叉法),'canny'指定坎尼方法(SIGMA 为高斯滤波器的标准差)。
THRESH 指定分割方法的阈值。
DIRECTION 指定分割方法的方向,可以指定'horizontal'(水平)或'vertical'(垂直)边缘,或'both'(双向)边缘(默认值)。
如果 THRESH、DIRECTION、SIGMA 默认,则由 MATLAB 指定相应的数值。
基于roberts、prewitt、soble、log和canny算子对图像进行边缘检测
abc=imread('hai.jpg');
C=rgb2gray(abc);
B1=edge(C,'roberts');
B2= edge(C,'prewitt');
B3= edge(C,'sobel');
B4= edge(C,'log');
B5= edge(C,'canny');
figure,imshow(B1),title('Reberts算子边缘检测');
figure,imshow(B2,[]),title('Prewitt算子边缘检测');
figure,imshow(B3,[]),title('Sobel算子边缘检测');
figure,imshow(B4,[]),title('LoG算子边缘检测');
figure,imshow(B5,[]),title('canny算子边缘检测');
输出:
霍夫变换
霍夫变换(Hough Transform)是一种边界跟踪方法,它利用图像的全局特性直接检测目标轮廓。利用霍夫变换可以从图像中识别几何形状,应用很广泛,也有很多改进算法。最基本的霍夫变换是从黑白图像中检测直线(线段)。在预先知道区域形状的条件下,利用霍夫变换可以方便地将不连续的边缘像素点连接起来得到边界曲线的逼近,其主要优点是受噪声和曲线间断的影响较小。
基于Hough变换的图像分割
在进行霍夫变换前应该先对图像进行预处理,一般先对灰度图像进行二值化处理,然后细化边缘得到图像骨架,再采用霍夫变换提取图像中的直线。调用IPT 二值图像标准霍夫变换函数 [H,THETA,RHO]=hough(BW),其中BW是待变换的二值图像,(THETA,RHO)分别是离散化的(θ,ρ)。H是霍夫变换矩阵。
Ⅰ:读入图像;
Ⅱ:检测图像边缘;
Ⅲ:实现Hough变换;
Ⅳ:输出结果。
%基于Hough变换
clear;
close all;
clc;
fg=rgb2gray(imread('hai.png'));
bw=edge(fg,'canny');%canny算子边缘检测得二值边缘图像
figure,imshow(bw);
[h,t,r]=hough(bw,'RhoResolution',0.5,'Thetaresolution',0.5);
figure,imshow(imadjust(mat2gray(h)),'XData',t,'YData',r,'InitialMagnification','fit');
xlabel('\theta'),ylabel('\rho');
axis on,axis normal,hold on;
P=houghpeaks(h,2);
x=t(P(:,2));y=r(P(:,1));
plot(x,y,'s','color','r');
lines=houghlines(bw,t,r,P,'FillGap',5,'Minlength',7);%检测图像中得直线段
figure,imshow(fg);
hold on;
max_len=0;
for i=1:length(lines)
xy=[lines(i).point1;lines(i).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','g');
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','y');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','r');
end
hold off
输出:
.
.文章来源:https://www.toymoban.com/news/detail-778832.html
.
.
.
资料来源为以前学习阶段搜寻到的资料,或电子版或纸质版的资料,已寻不到来源,以此形式来及记录以前的学习......以上为中部部分的文字说明,另附资料和代码等在往后文章......文章来源地址https://www.toymoban.com/news/detail-778832.html
到了这里,关于图像处理——边缘检测(MATLAB实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!