邊緣檢測演算法matlab
Ⅰ 需要一段用Canny運算元實現圖像邊緣檢測的MATLAB程序,拜託高手們幫幫忙,很急啊!
M=imread('');%讀入你的圖片
BW = edge(I,'canny');%邊緣檢測函數
imshow(BW) %顯示檢測後的圖象
Ⅱ 如何用matlab進行圖像去噪與邊緣檢測
添加椒鹽雜訊:
I = imread('eight.tif');
J = imnoise(I,'salt & pepper',0.02);%%0.02為雜訊密度,默認值為0.05
邊緣檢測:
I = imread('circuit.tif');
BW1 = edge(I,'prewitt');
BW2 = edge(I,'canny');
%%%%%%%%%%%%%%%%%%%%%%%%
doc edge,裡面對邊緣檢測有詳細的介紹。
doc imnoise,里也有添加各種雜訊的方法。
Ⅲ 用matlab如何通過圖像分割來檢測邊界
matlab實現邊緣檢測和圖像分割提供了很多有用的圖像處理函數,做圖像分割方法有很多,例如:基於閾值的方法,基於邊緣的方法,基於區域的方法,基於凸輪的方法以及基於能量泛函的方法。其中matlab裡面有很多做邊緣檢測的演算法,最常用的是sobel,prewitte演算法,通過該運算元與圖像的卷積運算,即可檢測到圖像邊緣,進一步分割目標區域。
Ⅳ 關於圖像處理,利用sobel運算元邊緣檢測的Matlab程序
'放大2倍.jpg'不是灰度圖像,用I1=rgb2gray(I);轉化一下再做提取。
Ⅳ Matlab邊緣檢測問題
用mesh語句似乎可以,具體也不了解你的情況,感覺怪怪的,發一段我以前些的程序,用羅伯特運算元寫的,把運算元一改就是sobel了。兩種邊緣檢測近似演算法奉上:
clc
close all
clear all
%%%生成高斯平滑濾波模板%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
hg=zeros(3,3); %設定高斯平滑濾波模板的大小為3*3
delta=0.5;
for x=1:1:3
for y=1:1:3
u=x-2;
v=y-2;
hg(x,y)=exp(-(u^2+v^2)/(2*pi*delta^2));
end
end
h=hg/sum(hg(:));
%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%讀入圖像%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%
f = imread('1111.tif'); % 讀入圖像文件
f=rgb2gray(im2double(f));
imshow(f)
title('原始圖像');
[m,n]=size(f);
ftemp=zeros(m,n);
rowhigh=m-1;
colhigh=n-1;
%%%高斯濾波%%%
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
A=h.*mod;
ftemp(x,y)=sum(A(:));
end
end
f=ftemp
figure,imshow(f)
title('通過高斯濾波器後的圖像');
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %%%利用roberts運算元進行邊緣檢測%%%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sx=[-1 -2 -1;0 0 0;1 2 1];
sy=[-1 0 1;-2 0 2;-1 0 1];
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sx.*mod;
fsy=sy.*mod;
ftemp(x,y)=sqrt((sum(fsx(:)))^2+(sum(fsy(:)))^2);
end
end
fr=im2uint8(ftemp);
figure,imshow(fr)
title('用roberts運算元邊緣檢測的原始圖像');
%%%域值分割%%%
TH1=60; %設定閾值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fr(x,y)>=TH1)&((fr(x,y-1) <= fr(x,y)) & (fr(x,y) > fr(x,y+1)) )
fr(x,y)=200;
elseif(fr(x,y)>=TH1)&( (fr(x-1,y) <=fr(x,y)) & (fr(x,y) >fr(x+1,y)))
fr(x,y)=200;
else fr(x,y)=50;
end
end
end
figure,imshow(fr)
title('用roberts運算元邊緣檢測並細化後的圖像');
%%%%%%%%%%%%%%%%%%%%%%%%%%
利用第一種近似演算法進行邊緣檢測%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%3*3的sobel運算元%%%%%%%%
sx=[-1 -2 -1;0 0 0;1 2 1];
sy=[-1 0 1;-2 0 2;-1 0 1];
%sx=[0 1 2;-1 0 1;-2 -1 0];
%sy=[-2 -1 0;-1 0 1;0 1 2];
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sx.*mod;
fsy=sy.*mod;
ftemp(x,y)=abs(sum(fsx(:)))+abs(sum(fsy(:)));
end
end
fs=im2uint8(ftemp);
figure,imshow(fs)
title('用第一種近似演算法進行邊緣檢測的原始圖像');
%%%域值分割%%%
TH2=200; %設定閾值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fs(x,y)>=TH2)&((fs(x,y-1) <= fs(x,y)) & (fs(x,y) > fs(x,y+1)) )
fs(x,y)=200;
elseif(fs(x,y)>=TH2)&( (fs(x-1,y) <=fs(x,y)) & (fs(x,y) >fs(x+1,y)))
fs(x,y)=200;
else fs(x,y)=50;
end
end
end
figure,imshow(fs)
title('採用第一種近似演算法進行邊緣檢測後的圖像');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%利用第二種近似演算法進行邊緣檢測%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%3*3的sobel運算元%%%%%%%%
sx=[-1 -2 -1;0 0 0;1 2 1];
sy=[-1 0 1;-2 0 2;-1 0 1];
%sx=[0 1 2;-1 0 1;-2 -1 0];
%sy=[-2 -1 0;-1 0 1;0 1 2];
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sx.*mod;
fsy=sy.*mod;
ftemp(x,y)=max(abs(sum(fsx(:))),abs(sum(fsy(:))));
end
end
fs=im2uint8(ftemp);
figure,imshow(fs)
title('用第二種近似演算法進行邊緣檢測的原始圖像');
%%%域值分割%%%
TH2=200; %設定閾值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fs(x,y)>=TH2)&((fs(x,y-1) <= fs(x,y)) & (fs(x,y) > fs(x,y+1)) )
fs(x,y)=200;
elseif(fs(x,y)>=TH2)&( (fs(x-1,y) <=fs(x,y)) & (fs(x,y) >fs(x+1,y)))
fs(x,y)=200;
else fs(x,y)=50;
end
end
end
figure,imshow(fs)
title('採用第二種近似演算法進行邊緣檢測後的圖像');
Ⅵ 基於matlab的邊緣檢測的robert運算元的演算法怎麼寫
matlab本身有庫函數的。直接調用啊
VC代碼:
void BianYuanJianCeDib::Robert()
{
LPBYTE p_data; //原圖數據區指針
int wide,height; //原圖長、寬
int i,j; //循環變數
int pixel[4]; //Robert運算元
p_data=this->GetData ();
wide=this->GetWidth ();
height=this->GetHeight ();
LPBYTE temp=new BYTE[wide*height]; //新圖像緩沖區
//設定新圖像初值為255
memset(temp,255, wide*height);
//由於使用2*2的模板,為防止越界,所以不處理最下邊和最右邊的兩列像素
for(j=0;j<height-1;j++)
for(i=0;i<wide-1;i++)
{
//生成Robert運算元
pixel[0]=p_data[j*wide+i];
pixel[1]=p_data[j*wide+i+1];
pixel[2]=p_data[(j+1)*wide+i];
pixel[3]=p_data[(j+1)*wide+i+1];
//處理當前像素
temp[j*wide+i]=(int)sqrt((pixel[0]-pixel[3])*(pixel[0]-pixel[3])
+(pixel[1]-pixel[2])*(pixel[1]-pixel[2]));
}
//將緩沖區中的數據復制到原圖數據區
memcpy(p_data, temp,wide*height);
//刪除緩沖區
delete temp;
}