数学建模 B题 碎纸片的拼接复原__MATLAB源程序
Posted 豆子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学建模 B题 碎纸片的拼接复原__MATLAB源程序相关的知识,希望对你有一定的参考价值。
第一问:
采用灰色关联分析(完美解决~~哈哈,调试出来了)
clc; clear;
% 第一问代码 文件名:Qusetion1.m
filename = \'E:\\数学建模论文\\暑假数模培训\\暑假作业\\2013年B题碎纸片\\附件1\\*.bmp\'
files = dir(filename); %批量载入图像
image = cell(1, size(files, 1)) ; % 定义一个元组
for n=1:numel(files)
image{n} = imread([\'E:\\数学建模论文\\暑假数模培训\\暑假作业\\2013年B题碎纸片\\附件1\\\', files(n).name]);
end
[h,z] = size(image{1,1}); % 计算一张图片矩阵的大小(行,列)
% 只取最左和最右列进行灰色关联分析
% byz 存放 n 张图片的,最左列 (1980行, n列)
for k=1:n
byz(:, k) = image{1, k}(: , 1); % 将第k张图片的最左边一列放入矩阵byz的第k列
byy(:, k) = image{1, k}(: , z); % 将第k张图片的最右边一列放入矩阵byy的第k列
end
%利用页边距寻找第一张图片
for i=1:n % 遍历附件1的所有图片
sum=0;
for j=1:h % 遍历 图片最左列 的所有行
if byz(j,i) == 255 % 计算255的个数
sum=sum+1;
else
break;
end
end
if sum==h % 如果 最左列255个数和行数一样,说明他属于第一张图片
f=i;
end
end
paixu=zeros(1,n); % 定义 n列向量,用来排序
index=1;
paixu(index) = f; % 选择第一张图片
i = f;
guanliandu = ones(n, 1);
rho = 0.45; % 分辨系数
while index <= n - 1
cankao = byy(:, i);
byz(:, i)= nan;
t = repmat(cankao, [1, n]) - byz(:,:) ;
mmin = min(min(t));
mmax = max(max(t));
xishu = (mmin + rho .* mmax) ./ (t +rho .* mmax);
guanliandu = mean(xishu);
[gsort, ind] = sort(guanliandu, \'descend\');
i = ind(1);
index = index + 1;
paixu(index) = i;
end
% 通过 系数的排序进行合成图片,在此之前,无论用什么方法,只需要求出关于关联系数的排序就好了
temp = image{ paixu(1) };
for i=2:n
temp=[temp image{ paixu(i)} ]; %将排序好的图片存放与temp
end
imshow(temp) %完整显示整张纸片
方案二:采用贪心思想解决
% 第一问代码 文件名:Qusetion1.m
files = dir(\'E:\\数学建模论文\\暑假数模培训\\暑假作业\\2013年B题碎纸片\\附件1\\*.bmp\'); %批量载入图像
image = cell(1, size(files, 1)) % 定义一个元组
for n=1:numel(files)
image{n} = imread([\'E:\\数学建模论文\\暑假数模培训\\暑假作业\\2013年B题碎纸片\\附件1\\\', files(n).name]);
end
[h,z] = size(image{1,1}); % 计算一张图片矩阵的大小(行,列)
% 只取最左和最右列进行灰色关联分析
% byz 存放 n 张图片的,最左列 (1980行, n列)
for k=1:n
byz(:, k) = image{1, k}(: , 1); % 将第k张图片的最左边一列放入矩阵byz的第k列
byy(:, k) = image{1, k}(: , z); % 将第k张图片的最右边一列放入矩阵byy的第k列
end
%利用页边距寻找第一张图片
for i=1:n % 遍历附件1的所有图片
sum=0;
for j=1:h % 遍历 图片最左列 的所有行
if byz(j,i) == 255 % 计算255的个数
sum=sum+1;
else
break;
end
end
if sum==h % 如果 最左列255个数和行数一样,说明他属于第一张图片
f=i;
end
end
paixu=zeros(1,n); % 定义 n列向量,用来排序
index=1;
paixu(index) = f; % 选择第一张图片
%依据连续性模型需找匹配点
for i=2:n % n - 1 张图片
max=0;
for j=1:n % n 张图片
sumofbp = 0; % 选取非白色点进行匹配,匹配过程中,非白色点的总数记为sumofb
xishu = 0; % 用来计算 灰色关联系数 (最大匹配率)
for k = 2 : h-1 % 一张图片(2, h-1)行
if byy(k, paixu(index)) ~= 255 %最右一列(第k行, 当前一张图片0~18) != 255 ==> 非白色
if byz(k,j) < 255 || byz(k-1,j) < 255 || byz(k+1, j) < 255 % 最左一列(k附近三行, j张图片) => 非白色
xishu = xishu+1;
else
xishu = xishu;
end;
end
end
if xishu > max
max = xishu;
signal = j;
end
end
index=index+1;
paixu(index)=signal; %存放排好序的图片序号
end
temp = image{ paixu(1) };
for i=2:n
temp=[temp image{ paixu(i)}]; %将排序好的图片存放与temp
end
imshow(temp) %完整显示整张纸片
(中英文都可以复原)
第二问:(等待实现).....
以上是关于数学建模 B题 碎纸片的拼接复原__MATLAB源程序的主要内容,如果未能解决你的问题,请参考以下文章