MATLAB碎纸片的拼接复原

该文介绍了一种MATLAB实现的图像碎片拼接算法,针对纵切和纵横交错切两种情况。算法通过比较碎片之间的信噪比确定相邻关系,并采用用户交互方式辅助拼接。实验结果显示,该算法在纵切情况下有效,对纵横切场景也具有可行性。源码包括f2()、f3()等函数,用于实现拼接过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MATLAB碎纸片的拼接复原


  1. 摘要

对于只有纵切的情形,文章通过比较当前待拼碎片与剩余碎片的信噪比psnr[1,3,4]的值来确定两碎片是否为邻接碎片;拼接算法首先连续调用右拼函数直到拼接到原图右边界,然后连续调用左拼函数直到拼接到原图左边界,从而得到整幅复原图像;对于单面纵横交错切的情形,文章对首先采用纵切拼接算法将碎片拼接成多幅横条图片,然后将各横条图片矩阵转置[2],再次采用纵切拼接算法拼接;两种情形的拼接,都存在人为参与;实验证明,我们的算法对纵切情形是有效的,对纵横切情况是可行的。

  1. 源码

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的复原图片



v2-99b546631774348e3163cb12a17d4e08_b.jpg



图1 附件1的复原图片











(2)附件2的复原图像



v2-0db26227adc688f53fbab5fcd9471d1e_b.jpg


图2 附件2的复原图片


(3) 附件3的复原图像出来的横条图片


v2-f3d6d093a72be5ff3aea6f684c8f7677_b.jpg


图3 附件3图片拼接时生成的横条图片一



v2-881e48d1c0f224398dcb198148aa8948_b.jpg


图4 附件3图片拼接时生成的横条图片二



v2-ee3b00d92f4f4f94a9f939bc22aece21_b.jpg


图5 附件3图片拼接时生成的横条图片三


v2-cc505923d51c8ebe0cff6ecabe470dc7_b.jpg


图6 附件3图片拼接时生成的横条图片四



v2-553189011e150f3809d5b5984ee8ac3b_b.jpg


图7 附件3图片拼接时生成的横条图片五



v2-60ba22e50e5efd5a59c683366418bea7_b.jpg


图8 附件3图片拼接时生成的横条图片六



v2-5ac0d7c5abe8b43ce90e2dda35e1d4da_b.jpg


图9 附件3图片拼接时生成的横条图片七



v2-759c7b2075a82d64d13ad222b7bcc891_b.jpg


图10 附件3图片拼接时生成的横条图片八



v2-57ed502fd2811ab5aa7075fe2206da3a_b.jpg


图11 附件3图片拼接时生成的横条图片九



v2-668b3446ef0a3e0f6fb4f207e8c9077e_b.jpg


图12 附件3图片拼接时生成的横条图片十



v2-101712435d0a8dfbb02de0eb6c648957_b.jpg


图14 附件3图片拼接时生成的横条图片十一

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值