Matlab实现图像边缘检测
生活随笔
收集整理的這篇文章主要介紹了
Matlab实现图像边缘检测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
邊緣檢測
為了在一幅圖像 f 的(x,y)位置尋找邊緣的強度和方向,所選擇的工具就是梯度,梯度使用向量來表示:
該向量指出了圖像 f 在位置(x,y)處的最大變化率的方向,梯度向量的大小表示為:
它是梯度向量方向變化率的值。
梯度向量的方向表示為:
梯度算子
roberts算子:
sobel算子:
prewitt算子:
Matlab實現
function output = my_edge(input_img,method)
if size(input_img,3)==3input_img=rgb2gray(input_img);
endinput_img=im2double(input_img);
sobel_x=[-1,-2,-1;0,0,0;1,2,1];
sobel_y=[-1,0,1;-2,0,2;-1,0,1];
prewitt_x=[-1,-1,-1;0,0,0;1,1,1];
prewitt_y=[-1,0,1;-1,0,1;-1,0,1];psf=fspecial('gaussian',[5,5],1);
input_img=imfilter(input_img,psf);%高斯低通濾波,平滑圖像,但可能會使圖像丟失細節
input_img=medfilt2(input_img); %中值濾波消除孤立點
[m,n]=size(input_img);
output=zeros(m,n);
if nargin==2if strcmp(method,'sobel')for i=2:m-1for j=2:n-1local_img=input_img(i-1:i+1, j-1:j+1);
%近似邊緣檢測,加快速度 %output(i,j)=abs(sum(sum(sobel_x.*local_img)))+abs(sum(sum(sobel_x.*local_img)));output(i,j)=sqrt(sum(sum(sobel_x.*local_img))^2+sum(sum(sobel_y.*local_img))^2);endendelseif strcmp(method,'prewitt')for i=2:m-1for j=2:n-1local_img=input_img(i-1:i+1, j-1:j+1);output(i,j)=sqrt(sum(sum(prewitt_x.*local_img))^2+sum(sum(prewitt_y.*local_img))^2);endendelseerrordlg('maybe you should input sobel or prewitt');end
else %如果不輸入算子的名稱,默認使用roberts算子進行邊緣檢測for i=1:m-1for j=1:n-1output(i,j)=abs(input_img(i,j)-input_img(i+1,j+1))+ ...abs(input_img(i+1,j)-input_img(i,j+1));endend
endoutput=imadjust(output);%使邊緣圖像更明顯
thresh=graythresh(output);%確定二值化閾值
output=bwmorph(im2bw(output,thresh),'thin',inf);%強化細節
end
代碼效果:
總結
以上是生活随笔為你收集整理的Matlab实现图像边缘检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Miller方法产生、检验素数
- 下一篇: c++之openGL在VS中的配置及简单