clc
clear
%load 'C:\Users\Administrator\Desktop\碎纸拼接\程序\汉语\matlab_A.mat'
load 'H:\我们团队做过的题目\训练2\程序\二小问---程序\汉语\新发法2\bi_jiao_ju_zhen_A'
global A
x1=[94 34 84 183 90 47 121 42 124 144 77 112 149 97 136 164 127 58 43];
x2=[49 54 65 143 186 2 57 192 178 118 190 95 11 22 129 28 91 188 141];
x3=[61 19 78 67 69 99 162 96 131 79 63 116 163 72 6 177 20 52 36];
x4=[168 100 76 62 142 30 41 23 147 191 50 179 120 86 195 26 1 87 18];
x5=[29 64 111 201 5 92 180 48 37 75 55 44 206 10 104 98 172 171 59];
x6=[38 148 46 161 24 35 81 189 122 103 130 193 88 167];
x7=[25 8 9 105 74];
x8=[71 156 83 132 200 17 80 33 202 198 15 133];
x9=[170 205 85 152 165 27 60];
x10=[13 182 109 197 16 184 110 187 66 106 150 21 173 157 181 204 139 145];
x11=[128 3 159 82 199 135 12 73 160 203 169 134 39 31 51 107 115 176];
x12=[146 102 154 114 40 151 207 155 140 185 108 117 4 101 113 194 119 123];
x13=[7 208 138 158 126 68 175 45 174 0 137 53];
x14=[56 93 153 70 166 32 196];
x1=x1+1;x2=x2+1;x3=x3+1;x4=x4+1;x5=x5+1;x6=x6+1;x7=x7+1;x8=x8+1;
x9=x9+1;x10=x10+1;x11=x11+1;x12=x12+1;x13=x13+1;x14=x14+1;
%为了放到矩阵x中
x6(19)=0;x7(19)=0;x8(19)=0;x9(19)=0;x10(19)=0;x11(19)=0;x12(19)=0;
x13(19)=0;x14(19)=0;
global x
x=[x1;x2;x3;x4;x5;x6;x7;x8;x9;x10;x11;x12;x13;x14];
%构造比较矩阵
line=ones(180,1)*255;
%筛选左边的全白
n_zuo(14,2)=0;
for i=1:14
t=0;
for j=1:19
if x(i,j)~=0
c=isequal(A(:,1,x(i,j)),line);
if c==1
t=t+1;
n_zuo(i,t)=x(i,j);
end
end
end
end
n_j_zuo=n_zuo;
%筛选右边的全白
n_you(14,2)=0;
for i=1:14
t=0;
for j=1:19
if x(i,j)~=0
c=isequal(A(:,72,x(i,j)),line);
if c==1
t=t+1;
n_you(i,t)=x(i,j);
end
end
end
end
n_j_you=n_you;
%左边分类编程
zuo_liang_ge(1,2)=0;%左边有两个全白。
k_0=1;
zuo_yi_ge(1,1)=0;%左边只有一个是全白的。
k_1=1;
zuo_ling_ge(1,2)=0;%左边无全白的!
k_2=1;
for i=1:14
k=0;
for j=1:2
if n_j_zuo(i,j)==0
k=k+1; %k=0表示:左边有两个全白
end %k=1表示:左边有1个全白
end
if k==0%左边有两个全白。
zuo_liang_ge(k_0,1:2)=n_j_zuo(i,
;
zuo_liang_ge(k_0,4)=i;
k_0=k_0+1;
end
if k==1%左边只有一个是全白的。
zuo_yi_ge(k_1,1)=n_j_zuo(i,1);
zuo_yi_ge(k_1,4)=i;
k_1=k_1+1;
end
if k==2%左边无全白的!
zuo_ling_ge(k_2,1:2)=n_j_zuo(i,
;
zuo_ling_ge(k_2,4)=i;
k_2=k_2+1;
end
end
%右边分类编程
you_2_ge(1,2)=0;%右边有两个全白。
k_2=1;
you_1_ge(1,1)=0;%右边只有一个是全白的。
k_1=1;
you_0_ge(1,2)=0;%右边无全白的!
k_0=1;
for i=1:14
k=0;
for j=1:2
if n_j_you(i,j)==0
k=k+1; %k=0表示:右边有两个全白
end %k=1表示:右边有1个全白
end
if k==0%右边有两个全白。
you_2_ge(k_2,1:2)=n_j_you(i,
;
you_2_ge(k_2,4)=i;
k_2=k_2+1;
end
if k==1%右边只有一个是全白的。
you_1_ge(k_1,1)=n_j_you(i,1);
you_1_ge(k_1,4)=i;
k_1=k_1+1;
end
if k==2%右边无全白的!
you_0_ge(k_0,1:2)=n_j_you(i,
;
you_0_ge(k_0,4)=i;
k_0=k_0+1;
end
end
%左边全白为一个的排序
suo_ying=zuo_yi_ge;
bai=suo_ying(:,1); %左边全白所对应的页数。
bai_row=suo_ying(:,4); %左边全白所对应的 x 所在的行。
n_pai_xu=length(bai); %要排几行。
pai_xu(1:n_pai_xu,1)=bai; %排好之后的矩阵。
%----------------进行排序-----------------------------
flag=72+1; %做标志位。
A(1,flag,
=0;
for hang=1:n_pai_xu
ye=bai(hang,1); %左边全白所对应的页数。
x_row=bai_row(hang,1); %左边全白所对应的 x 所在的行。
A(1,flag,ye)=1; %首先,将最左边为全白的做标记。
B=A(:,72,ye);
%比较与最左边的最小距离。
for i=1:18 %该循环安排新的最左边。
d(1,1:19)=inf; %注意初始化存储矩阵,否则,Matlab默认赋0,找最小值会出错!!! for j=1:19
if x(x_row,j) ~=0
if A( 1,flag, x(x_row,j) )==1
d(1,j)=inf;
elseif A( 1,flag, x(x_row,j) )==0
R(j)= pdist2( double( B )',double( A( :,1, x(x_row,j) ) )' );
d(1,j)=sum( R(j) );
end
end
end
[zhi,wei_zi]=min( d );
A(1,flag, x(x_row,wei_zi) )=1; %找到相邻图片后,做标志位。
if x(x_row,i+1)~=0 %判断 x 矩阵的元素是否为零。
B=A(:,72,x(x_row,wei_zi) ); %并且更新最左边图片位置。
pai_xu(hang,i+1)=x(x_row,wei_zi);
elseif x(x_row,i+1)==0 %如果为零,则将其位置赋inf
pai_xu(hang,i+1)=inf;
end
end
end
%显示图片
for i=1:n_pai_xu
for j=1:19
if pai_xu(i,j)~=inf
B(:, 72*(j-1)+1:72*j ,i)=A(:,1:72,pai_xu(i,j));
end
end
%显示图片
% figure
% imshow(B(:,:,i));
end
pai_xu=pai_xu-1;
pai_xu_2_quan_bai=quan_bai_2(zuo_liang_ge); %全部用第一个
%用 zuo_ling_ge,you_1_ge 先找出最右边为全白的图片
pai_xu_2_wu_bai=quan_bai_0(zuo_ling_ge,you_1_ge); %全部用第一个