www.pudn.com > erode.rar > erode.m
clear all;
clc;
M=6;
N=9; %solarcell的行数与列数
%I=imread('.\testpic\milkdrop.gif');
%I=imread('.\testpic\peppers.gif');
%I=imread('.\testpic\left.png');
%I=imread('.\testpic\lena.bmp');
%I = imread('.\testpic\finger_g.BMP');
%I = imread('.\testpic\bacteria.BMP');
%I = imread('.\use\IMAGE15.bmp');
I = imread('.\IRPIC\IR_all_s_g.BMP');
[m,n]=size(I);
imshow(I);
title('原图');
%中值滤波
R=zeros(m,n);
for i=2:m-1
for j=2:n-1
aa=[I(i-1,j-1) I(i-1,j) I(i-1,j+1) I(i,j-1) I(i,j) I(i,j+1) I(i+1,j-1) I(i+1,j) I(i+1,j+1)];
ii=0;
for jj=1:9-ii
for ii=1:8
if(aa(ii)>aa(ii+1))
cc=aa(ii);
aa(ii)=aa(ii+1);
aa(ii+1)=cc;
end
end
end
R(i,j)=aa(5);
end
end
S=uint8(R);
figure;
imshow(S);
title('中值滤波后的图像');
%otsu 自动阈值计算
Y=zeros(1,256);
thresholdValue=1; %阈值初值
for i=2:m-1
for j=2:n-1
k=S(i,j);
Y(1,k+1)=Y(1,k+1)+1;
end
end
sum=0;
csum=0;
n0=0;
for k=1:256
sum=sum+k*double(Y(1,k));
n0=n0+Y(k);
end
fmax=-1;
n1=0;
for k=1:256
n1=n1+Y(k);
if(n1==0)
continue;
end
n2=n0-n1;
if(n2==0)
break;
end
csum=csum+k*double(Y(k));
m1=csum/n1;
m2=(sum-csum)/n2;
sb=n1*n2*(m1-m2)^2;
if(sb>fmax)
fmax=sb;
thresholdValue=k;
end
end
%利用4个方向的roberts和进行边缘提取,并二值化
Q=zeros(m,n);
for i=2:m-1
for j=2:n-1
sideling=abs(S(i-1,j-1)-S(i,j))+abs(S(i-1,j+1)-S(i,j))+abs(S(i+1,j-1)-S(i,j))+abs(S(i+1,j+1)-S(i,j));
verical=abs(S(i-1,j)-S(i,j))+abs(S(i+1,j)-S(i,j))+abs(S(i,j-1)-S(i,j))+abs(S(i,j+1)-S(i,j));
x=sideling+verical;
if(x<0.5*thresholdValue)
Q(i,j)=1;
end
end
end
figure;
imshow(255*Q);
title('二值化后的图像');
%腐蚀处理
B=[1 1;1 1];
qsum=0;
QQ=zeros(m,n);
for i=1:m-1
for j=1:n-1
for ii=1:2
for jj=1:2
qsum=qsum+~xor(B(ii,jj),(1-Q(i+ii-1,j+jj-1)));
end
end
if(qsum==4)
QQ(i,j)=0;
else
QQ(i,j)=1;
end
qsum=0;
end
end
SS=255*QQ;
figure;
imshow(SS);
title('腐蚀处理后的图像');
Err=255*abs(Q-QQ);
figure;
imshow(Err);
title('膨腐蚀前后相差的图像');