for n = 1:dataNum - 1 minCount = 0; index = 0;
for i = 1:dataNum
length = size(array); %记录已经拼接的个数 flag = 0;
%如果已经取过了,则跳过,跳2层 for j = 1:length(2); if array(j) == i flag = 1; break; end end
if flag == 1 continue; end
%比较二值化后有多少个不同点
count = calPoint(data,array(length(2)),i,2);
%记录最小值
if minCount == 0
minCount = count; index = i; end
if minCount > count minCount = count; index = i; end end
%当前拼接长度
length = size(array);
array(length(2)+1) = index; end
%显示图像
fullData = data{array(1)}; for i = 2:dataNum
fullData = [fullData,data{array(i)}]; end
imshow(fullData);
%将排列减1,即以前从1开始,现在从0开始 array = array - 1;
附录4.3
24
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 按列判断左页边距像素 % 参数:
% data 图像RGB数据
% col 最左边子图像的序号,从1开始 % 返回值:
% result 子图像出现的第一个非白色的像素所在列 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function result = judgeLeft(data,col)
%计算图像像素
dataSize = size(data{col});
%返回为0则表示该列完全是空白的,即错误结果 result = 0;
%按列遍历第一个出现的非白色像素 for i = 1:dataSize(2) for j = 1:dataSize(1)
if data{col}(j,i) ~= 255 result = i; return; end end end
附录4.4
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 计算相邻子图不同像素点的个数 % 参数:
% data 图像RGB数据 % a 左子图所在的序号 % b 右子图所在的序号
% mode 1为向左 2为向右 3为向上 4为向下 % 返回值:
% count 相邻子图不同像素点的个数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function count = calPoint(data,a,b,mode)
%计算子图的尺寸
dataSize = size(data{1});
%遍历最佳阀值
count = 0; %记录该阀值有多少个不同点 A = data{b}; %记录右图的图像数据 B = data{a}; %记录左图的图像数据
if mode == 1
%比较有多少个不同点
25
for i = 1:dataSize(1)
if A(i,dataSize(2)) ~= B(i,1);
count = count+1; %记录不同点的个数 end end end
if mode == 2
for i = 1:dataSize(1)
if A(i,1) ~= B(i,dataSize(2));
count = count+1; %记录不同点的个数 end end end
if mode == 3
for i = 1:dataSize(2)
if A(dataSize(1),i) ~= B(1,i);
count = count+1; %记录不同点的个数 end end end
if mode == 4
for i = 1:dataSize(2)
if A(1,i) ~= B(dataSize(1),i);
count = count+1; %记录不同点的个数 end end end
附录4.5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 计算左侧图像的序号 % 参数:
% data 图像RGB数据 % 返回值:
% Array 计算出的左侧序号,从1开始记录,1即000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function LeftArray = leftArray(data)
%计算有多少个子图 temp = size(data); dataNum = temp(2);
%根据子图左页边距的像素遍历,记录最大空白像素的列的序号 for i = 1:dataNum
templeftArray(i) = judgeLeft(data,i); end
26
%降序排序,index为排序后对源数据的所引致
[sortLeftArray,index] = sort(templeftArray,'descend');
%取前m个索引数,即第一列的序号 for i = 1:11
LeftArray(i) = index(i); end
附录4.6
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 计算子图某一方向空白点的像素个数 % 参数:
% data 图像RGB数据 % num 图像编号
% mode 1为向左 2为向右 3为向上 4为向下 % 返回值:
% count 空白像素点的个数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function count = calWhitePoint(data,num,mode)
%计算子图的尺寸
dataSize = size(data{1});
count = 0; %记录有多少个不同点
A = data{num};
if mode == 1
%比较有多少个不同点 for i = 1:dataSize(1) if A(i,1) == 255
count = count+1; %记录白色点的个数 end end end
if mode == 2
for i = 1:dataSize(1)
if A(i,dataSize(2)) == 255
count = count+1; %记录白色点的个数 end end end
if mode == 3
for i = 1:dataSize(2) if A(1,i) == 255
count = count+1; %记录白色点的个数 end end
27
end
if mode == 4
for i = 1:dataSize(2)
if A(dataSize(1),i) == 255
count = count+1; %记录白色点的个数 end end end
附录4.7
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 计算每一图与其他图的不同点的个数 % 参数:
% data 图像RGB数据 % 返回值:
% l 与左图的距离 % r 与右图的距离 % u 与上图的距离 % d 与下图的距离
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [l,r,u,d] = sortData(data)
%计算有多少个子图 temp = size(data); dataNum = temp(2);
%遍历每一个图
for i = 1: dataNum for j = 1:dataNum
%计算与其他图不同点的个数 ll(j) = calPoint(data,i,j,1); rr(j) = calPoint(data,i,j,2); uu(j) = calPoint(data,i,j,3); dd(j) = calPoint(data,i,j,4); end %排序
[sortll,indexll] = sort(ll,'descend'); [sortrr,indexrr] = sort(rr,'descend'); [sortuu,indexuu] = sort(uu,'descend'); [sortdd,indexdd] = sort(dd,'descend'); %存储
l{i} = indexll; r{i} = indexrr; u{i} = indexuu; d{i} = indexdd; end
28