MATLAB碎纸片的拼接复原

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图片拼接时生成的横条图片十一

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法提供具体的代码。但是根据引用\[1\]和引用\[5\]的描述,可以知道该文章使用了Matlab编写程序来实现纸片拼接。文章通过比较待拼片与剩余片的信噪比值来确定两片是否为相邻片,并采用不同的拼接算法来处理不同情况的纸片。对于只有纵切的情形,文章连续调用右拼函数和左拼函数来拼接片,从而得到整幅复原图像。对于单面纵横交错切的情形,文章先将拼接成多幅横条图片,然后将各横条图片矩阵转置,再次采用纵切拼接算法拼接。这些算法都需要人为参与。所以,你可以根据这些描述来编写自己的Matlab代码来实现纸片拼接。 #### 引用[.reference_title] - *1* *3* *4* [纸片拼接复原算法MATLAB实现](https://blog.csdn.net/m0_59833680/article/details/119908276)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [MATLAB纸片的自动拼接复原技术](https://blog.csdn.net/m0_60677550/article/details/120264321)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *5* [MATLAB纸片拼接复原](https://blog.csdn.net/m0_65908410/article/details/122233909)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值