MATLAB碎纸片的拼接复原
- 摘要
对于只有纵切的情形,文章通过比较当前待拼碎片与剩余碎片的信噪比psnr[1,3,4]的值来确定两碎片是否为邻接碎片;拼接算法首先连续调用右拼函数直到拼接到原图右边界,然后连续调用左拼函数直到拼接到原图左边界,从而得到整幅复原图像;对于单面纵横交错切的情形,文章对首先采用纵切拼接算法将碎片拼接成多幅横条图片,然后将各横条图片矩阵转置[2],再次采用纵切拼接算法拼接;两种情形的拼接,都存在人为参与;实验证明,我们的算法对纵切情形是有效的,对纵横切情况是可行的。
- 源码
function [y,m,flag]=f2(a,Y,n)
i=length(n);
[p,q]=size(Y);
if sum(Y(:,q))>p-2
flag=0;
y=Y;
m=n;
return;
end
[x1,x2,x3]=size(a);
M=zeros(x1-i);
l=1;
for k=1:x1
flag=0;
for j=1:i
if k==n(j)
flag=1;
break;
end
end
if flag==0
M(l)=k;
l=l+1;
end
end
E=zeros(x1-i);
for k=1:(x1-i)
l=M(k);
b(:,:)=a(l,:,:);
Y1=Y(:,q);
b1=b(:,1);
E(k)=psnr(Y1,b1);
end
[E1,M1]=paixu2(E,M);
for z=x1-i:-1:1
P=M1(z);
yy(:,:)=a(P,:,:);
y=cat(2,Y,yy);
m=[n,P];
imwrite(y,'d:\p.bmp','bmp');
char=input('有意义否?N\Y','s');
if char=='Y'
flag=1;
break;
end
if char=='N'|char~='Y'
continue;
end
end
if char=='N'
y=Y;
m=n;
flag=0;
end
(6)f3()函数代码
function [y,m,flag1]=f3(a,Y,n)
i=length(n);
[p,q]=size(Y);
[x1,x2,x3]=size(a);
M=zeros(x1-i);
l=1;
for k=1:x1
flag=0;
for j=1:i
if k==n(j)
flag=1;
break;
end
end
if flag==0
M(l)=k;
l=l+1;
end
end
E=zeros(x1-i);
for k=1:(x1-i)
l=M(k);
b(:,:)=a(l,:,:);
Y1=Y(:,1);
b1=b(:,x3);
E(k)=psnr(Y1,b1);
end
[E1,M1]=paixu2(E,M);
for z=x1-i:-1:1
P=M1(z);
yy(:,:)=a(P,:,:);
y=cat(2,yy,Y);
m=[n,P];
imwrite(y,'d:\p.bmp','bmp');
char=input('有意义否?N\Y','s');
if char=='Y'
break;
end
if char=='N'| char~='Y'
continue;
end
end
flag1=1;
if char=='N'
y=Y;
m=n;
flag1=0;
end
(7) paixu2()函数代码
function [y,z]=paixu2(x,n)% 从小到大排序
m=size(x);
for j=1:m
for i=1:m-j
if (x(i)>x(i+1))
t=x(i);x(i)=x(i+1);x(i+1)=t;
t=n(i);n(i)=n(i+1);n(i+1)=t;
end
end
end
y=x;
z=n;
(8) psnr()函数代码
function s=psnr(a,b)
if size(a)~=size(b)
error('错误!两幅图像大小不一致!');
end
[m,n]=size(a);
a1=double(a);
b1=double(b);
sumdif=0;
max1=m*n*max(max(a1.^2));
for i=1:m
for j=1:n
sumdif=sumdif+(a1(i,j)-b1(i,j))^2;
end
end
if sumdif==0
sumdif=1;
end
s=max1/sumdif;
s=10*log10(s);
(9) ff()函数代码
function [c,C]=ff(a,m,n)
x1=length(m);
x2=length(n);
[a1,a2,a3]=size(a);
l=1;
x11=x1-x2;
if x11==0
c=ones(x11);
C=ones(x11,a2,a3);
return;
end
c=ones(x11);
C=ones(x11,a2,a3);
for k=1:x1
flag=0;
for i=1:x2
if m(k)==n(i)
flag=1;
break;
end
end
if(flag==0)
c(l)=m(k);
mm=m(k);
C(l,:,:)=a(mm,:,:);
l=l+1;
end
end
(10) pinjie1()函数代码
function pinjie1()
a=read1();
[x,x1,x2]=size(a);
p(:,:)=a(1,:,:);
n=[1];
[y,n,flag]=f2(a,p,n);
flag1=1;
if flag==0
[y,n,flag1]=f3(a,p,n);
end
while (flag1~=0|flag~=0)&length(y(1,:))<x2*19
if flag==1
[y,n,flag]=f2(a,y,n);
% fwrite(f1,y,n,'int');
else
[y,n,flag1]=f3(a,y,n);
% fwrite(f1,y,n,'int');
end
end
(11) pinjie2()函数代码
function pinjie2()
a=read2();
[x,x1,x2]=size(a);
p(:,:)=a(1,:,:);
n=[1];
[y,n,flag]=f2(a,p,n);
flag1=1;
if flag==0
[y,n,flag1]=f3(a,p,n);
end
while (flag1~=0|flag~=0)&length(y(1,:))<x2*19
if flag==1
[y,n,flag]=f2(a,y,n);
% fwrite(f1,y,n,'int');
else
[y,n,flag1]=f3(a,y,n);
% fwrite(f1,y,n,'int');
end
end
(12) pinjie3()函数代码
function pinjie3()
a=read3();
[x,x1,x2]=size(a);
p(:,:)=a(1,:,:);
n=[1];
[y,n,flag]=f2(a,p,n);
flag1=1;
if flag==0
[y,n,flag1]=f3(a,p,n);
end
while (flag1~=0|flag~=0)&length(y(1,:))<x2*19
if flag==1
[y,n,flag]=f2(a,y,n);
% fwrite(f1,y,n,'int');
else
[y,n,flag1]=f3(a,y,n);
% fwrite(f1,y,n,'int');
end
end
y1=y';
q=length(n);
q1=int16(x/q);
t=ones(q1,q*x2,x1);
t(1,:,:)=y1;
C=a;
[x,x1,x2]=size(a);
c=1:1:x;
for k=2:q1
[c,C]=ff(C,c,n);
[x,x1,x2]=size(C);
p(:,:)=C(1,:,:);
n=[1];
[y,n,flag]=f2(C,p,n);
flag1=1;
if flag==0
[y,n,flag1]=f3(C,p,n);
end
while (flag1~=0|flag~=0)&length(y(1,:))<x2*19
if flag==1
[y,n,flag]=f2(C,y,n);
% fwrite(f1,y,n,'int');
else
[y,n,flag1]=f3(C,y,n);
% fwrite(f1,y,n,'int');
end
end
y1=y';
t(k,:,:)=y1;
end
pin=pinjie3(t);
pin_=pin';
imwrite(pin_,'d:\pp.bmp');
a=t;
[x,x1,x2]=size(a);
p(:,:)=a(1,:,:);
n=[1];
[y,n,flag]=f2(a,p,n);
flag1=1;
if flag==0
[y,n,flag1]=f3(a,p,n);
end
while (flag1~=0|flag~=0)&length(y(1,:))<x2*19
if flag==1
[y,n,flag]=f2(a,y,n);
% fwrite(f1,y,n,'int');
else
[y,n,flag1]=f3(a,y,n);
% fwrite(f1,y,n,'int');
end
end
(13) pinjie4()函数代码
function pinjie4()
a=read4();
[x,x1,x2]=size(a);
p(:,:)=a(1,:,:);
n=[1];
[y,n,flag]=f2(a,p,n);
flag1=1;
if flag==0
[y,n,flag1]=f3(a,p,n);
end
while (flag1~=0|flag~=0)&length(y(1,:))<x2*19
if flag==1
[y,n,flag]=f2(a,y,n);
% fwrite(f1,y,n,'int');
else
[y,n,flag1]=f3(a,y,n);
% fwrite(f1,y,n,'int');
end
end
y1=y';
q=length(n);
q1=int16(x/q);
t=ones(q1,q*x2,x1);
t(1,:,:)=y1;
C=a;
[x,x1,x2]=size(a);
c=1:1:x;
for k=2:q1
[c,C]=ff(C,c,n);
[x,x1,x2]=size(C);
p(:,:)=C(1,:,:);
n=[1];
[y,n,flag]=f2(C,p,n);
flag1=1;
if flag==0
[y,n,flag1]=f3(C,p,n);
end
while (flag1~=0|flag~=0)&length(y(1,:))<x2*19
if flag==1
[y,n,flag]=f2(C,y,n);
% fwrite(f1,y,n,'int');
else
[y,n,flag1]=f3(C,y,n);
% fwrite(f1,y,n,'int');
end
end
y1=y';
t(k,:,:)=y1;
end
pin=pinjie3(t);
pin_=pin';
imwrite(pin_,'d:\pp.bmp');
a=t;
[x,x1,x2]=size(a);
p(:,:)=a(1,:,:);
n=[1];
[y,n,flag]=f2(a,p,n);
flag1=1;
if flag==0
[y,n,flag1]=f3(a,p,n);
end
while (flag1~=0|flag~=0)&length(y(1,:))<x2*19
if flag==1
[y,n,flag]=f2(a,y,n);
% fwrite(f1,y,n,'int');
else
[y,n,flag1]=f3(a,y,n);
% fwrite(f1,y,n,'int');
end
end
三、实验结果
(1)附件1的复原图片
图1 附件1的复原图片
(2)附件2的复原图像
图2 附件2的复原图片
(3) 附件3的复原图像出来的横条图片
图3 附件3图片拼接时生成的横条图片一
图4 附件3图片拼接时生成的横条图片二
图5 附件3图片拼接时生成的横条图片三
图6 附件3图片拼接时生成的横条图片四
图7 附件3图片拼接时生成的横条图片五
图8 附件3图片拼接时生成的横条图片六
图9 附件3图片拼接时生成的横条图片七
图10 附件3图片拼接时生成的横条图片八
图11 附件3图片拼接时生成的横条图片九
图12 附件3图片拼接时生成的横条图片十
图14 附件3图片拼接时生成的横条图片十一