|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
这是我毕业设计中的一个程序:利用傅立叶描述子进行边界重构
程序分2个部分:
1.获取原始图像的边界,程序如下:
A=imread('二值图(灰度).bmp');
A=im2bw(A);
imshow(A);
%获取图像的边界
L=bwlabel(A,8); %对图像进行标记
B=zeros(0,2); %初始化B
per=bwperim(L); %得到区域周长的图像
L2=bwlabel(per,8); %标记区域周长图像
[r,c]=find(L2==1); %找到组成周长的像素的坐标
rr=zeros(length(r),1); %初始化rr,cc
cc=zeros(length(c),1);
rr(1)=r(1);cc(1)=c(1);
r(1)=0; c(1)=0;
dir=0; %方向
%寻找边界
for j=1:1:length(r)
%查找当前点各个方向上的邻居点
[r1,c1]=find((r==rr(j)+1)&(c==cc(j)));
[r2,c2]=find((r==rr(j)+1)&(c==cc(j)-1));
[r3,c3]=find((r==rr(j))&(c==cc(j)-1));
[r4,c4]=find((r==rr(j)-1)&(c==cc(j)-1));
[r5,c5]=find((r==rr(j)-1)&(c==cc(j)));
[r6,c6]=find((r==rr(j)-1)&(c==cc(j)+1));
[r7,c7]=find((r==rr(j))&(c==cc(j)+1));
[r8,c8]=find((r==rr(j)+1)&(c==cc(j)+1));
%依次按1,8,7,6,5,4,3,2的方向把邻居点作为下一个当前点
x=0; y=0;
if~isempty(r1)
x=r1; y=c1; dir=1;
elseif~isempty(r8)
x=r8; y=c8; dir=8;
elseif~isempty(r7)
x=r7; y=c7; dir=7;
elseif~isempty(r6)
x=r6; y=c6; dir=6;
elseif~isempty(r5)
x=r5; y=c5; dir=5;
elseif~isempty(r4)
x=r4; y=c4; dir=4;
elseif~isempty(r3)
x=r3; y=c3; dir=3;
elseif~isempty(r2)
x=r2; y=c2; dir=2;
end % endif
if x==0 & y==0
break;
end
rr(j+1)=r(x); cc(j+1)=c(x);
r(x)=0; c(x)=0;
end;
rr(j+1)=rr(1);
cc(j+1)=cc(1);
B=[rr,cc];
第一个想请教大虾们的问题就是这里的B怎么转换成图像?
2.这是程序的第2个部分,是利用傅立叶描述子对获取的边界B进行重构,程序如下:
[nr,nc]=size(B);
if nr/2~= round(nr/2) %如果nr不是偶数
B(end +1,:)=B(end,:);
nr=nr+1;
end
x=0:(nr-1); %计算系数
m=((-1).^x)';
B(:,1)=m.*B(:,1);
B(:,2)=m.*B(:,2);
B=B(:,1)+i*B(:,2);
fd=fft(B); %傅立叶变换
nfd=length(fd); %傅立叶描述子的长度
n=255; %用于恢复的项数
d=round((nfd-n)/2); %计算需要清零的项数
fd(1:d)=0; %清零
fd(nfd-d+1:nfd)=0;
iff=ifft(fd); %傅立叶逆变换
ifd(:,1)=real(iff); %分别提取实部和虚部
ifd(:,2)=imag(iff);
ifd(:,1)=m.*ifd(:,1);
ifd(:,2)=m.*ifd(:,2);
第二个想请教大虾们的问题就是这里的ifd怎么转换成图像?哪位大虾99我啊,小弟在这里谢了!!!!!!!!
[ 本帖最后由 luranlr007 于 2007-5-24 19:50 编辑 ] |
|