查看: 7311|回复: 11|关注: 0

[已解决] 关于13年B题碎纸片拼接的程序

[复制链接]

新手

7 麦片

财富积分


050


7

主题

94

帖子

0

最佳答案
这是第一问的程序,我把红色部分三行分别改成Answer(1)=A和Answer(i)=A,图片还是能拼接出来,但是输出的图片连接顺序就不对了,这是怎么回事?还有绿色部分为什么不能写成for i=1:19  q=[p{1}];  end,我改成这样拼接出来的图片就剩最后一列了
希望论坛大神解答
clc
clear
p=cell(1,18);
for i=1:10
    imageName=strcat('00',num2str(i-1),'.BMP');
    p{i} = imread(imageName);
end
for i=11:19
    imageName=strcat('0',num2str(i-1),'.BMP');
    p{i} = imread(imageName);
end
sump=[];
Answer=[];
for i=1:19
    Answer(i)=i;
end

for i=1:19
    sump(i)=sum(p{i}(:,1));
end
A=find(sump==max(sump));
C=Answer(A);
Answer(A)=1;
Answer(1)=C;
B=p{A};
p{A}=p{1};
p{1}=B;

for i=2:19
   sump=[];
  for j=i:19
      a=p{i-1}(:,72);
      b=p{j}(:,1);
      s=abs(a-b);
      sump(j)=sum(s);
      for k=1:(i-1)
          sump(k)=9999999;
      end
   end
A=find(sump==min(sump));
C=Answer(A);
Answer(A)=Answer(i);
Answer(i)=C;
B=p{A};
p{A}=p{i};
p{i}=B;
end
Answer-1
q=[p{1}];
for i=2:19
q=[q,p{i}];
end
imshow(q)


回复主题 已获打赏: 0 积分

举报

新手

7 麦片

财富积分


050


7

主题

94

帖子

0

最佳答案
 楼主| 发表于 2014-8-23 07:55:43 | 显示全部楼层
顶一个

新手

7 麦片

财富积分


050


7

主题

94

帖子

0

最佳答案
 楼主| 发表于 2014-8-24 07:44:44 | 显示全部楼层
求大神解答啊
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

入门

84 麦片

财富积分


50500


1

主题

172

帖子

16

最佳答案
发表于 2014-8-24 10:11:36 | 显示全部楼层 |此回复为最佳答案
第一个问题:你的Answer和p是两个相互独立的东西,互不影响。你那么改只是把Answer的存放顺序搞错了,并不影响之前的对比和之后的p保存。
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

入门

84 麦片

财富积分


50500


1

主题

172

帖子

16

最佳答案
发表于 2014-8-24 10:13:55 | 显示全部楼层
2,不太懂你写的意思,如果是为了简化的话,可以这么改
  1. q=[];
  2. for i=1:19
  3. q=[q,p{i}];
  4. end
复制代码
回复此楼 已获打赏: 0 积分

举报

新手

5 麦片

财富积分


050


0

主题

1

帖子

0

最佳答案
发表于 2014-8-24 20:14:51 | 显示全部楼层
学习了。。。。。。。。。。

新手

7 麦片

财富积分


050


7

主题

94

帖子

0

最佳答案
 楼主| 发表于 2014-8-25 09:15:39 | 显示全部楼层
1185878525 发表于 2014-8-24 10:11
第一个问题:你的Answer和p是两个相互独立的东西,互不影响。你那么改只是把Answer的存放顺序搞错了,并不 ...

Answer的作用只是把存放顺序换过来以便最后最后提取排列序号吗?
p{}那一小段是吧其中的内容交换过来了?
回复此楼 已获打赏: 0 积分

举报

新手

7 麦片

财富积分


050


7

主题

94

帖子

0

最佳答案
 楼主| 发表于 2014-8-25 09:16:04 | 显示全部楼层
1185878525 发表于 2014-8-24 10:13
2,不太懂你写的意思,如果是为了简化的话,可以这么改

奥奥,懂了!!!
回复此楼 已获打赏: 0 积分

举报

新手

10 麦片

财富积分


050


6

主题

46

帖子

1

最佳答案
  • 关注者: 1
发表于 2014-8-25 12:55:39 | 显示全部楼层
本帖最后由 whb123 于 2014-8-25 12:59 编辑

给你看看我原先编写的程序,希望对你有帮助!!!!

%p1;
%程序;
%读取图片;
clc;clear ;
a=imread('000.bmp');
[m,n]=size(a);
N=19;%一共有十九张图片;
%创建拼接纸张像素矩阵,并读取图片。
aa=zeros(m,n,N);
b=0:18;
for i=1:N
    if b(i)<10
        imagename=strcat('0','0',int2str(b(i)),'.bmp');
    else
        imagename=strcat('0',int2str(b(i)),'.bmp');
    end
    aa(:,:,i)=imread(imagename);
end
%得到排在第一个位置图片的序号;
tou=zeros(N,1);
for i=1:N
    s=aa(:,1,i)==255;
    tou(i,1)=tou(i,1)+sum(s);
end
[mt,t]=max(tou);
%得到图片正确的排列顺序t0;
t0=zeros(N,1);t0(1,1)=t;%将每次得到正确的顺序号存入t0中;
t1=zeros(N,N);
for j=1:N-1
    for i=1:N
    s1=abs(aa(:,n,t0(j,1))-aa(:,1,i));
    t1(i,j)=sum(s1);
  end
  [mt,t0(j+1,1)]=min(t1(:,j));
end
t0=t0';
%还原输出图形标号的正确排列顺序;
b0={};
for i=1:N
    if t0(i)<10
        imagename=strcat('0','0',int2str(t0(i)-1));
    else
        imagename=strcat('0',int2str(t0(i)-1));
    end
    b0{i}=imagename;
end
b0
%将图片完美展示;
b=zeros(m,n*N);
for i=1:N
     b(:,(i-1)* n+1:i*n)=aa(:,:,t0(1,i));
end
double(b);
imshow(b,[]);
%结果;
p1;
'008''014''012''015''003''010''002''016''001''004''005''09''013''018''011''007''017''000''006'
p2;
'003''006''002''007''015''018''011''000''005''001''09''013''010''008''012''014''017''016''004'




  




  
        
回复此楼 已获打赏: 0 积分

举报

新手

7 麦片

财富积分


050


7

主题

94

帖子

0

最佳答案
 楼主| 发表于 2014-8-26 08:49:33 | 显示全部楼层
whb123 发表于 2014-8-25 12:55
给你看看我原先编写的程序,希望对你有帮助!!!!

%p1;

好,谢谢大神!!我仔细研读一下
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /5 下一条

快速回复 返回顶部 返回列表