码迷,mamicode.com
首页 > 其他好文 > 详细

数学建模 B题 碎纸片的拼接复原__MATLAB源程序

时间:2017-08-20 19:52:19      阅读:854      评论:0      收藏:0      [点我收藏+]

标签:源程序   one   ima   灰色   class   定义   max   esc   过程   

第一问:

技术分享技术分享

采用灰色关联分析(有误差,待优化):

clc; clear;
% 第一问代码 文件名: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;                        % 选择第一张图片

guanliandu = ones(n, 1);

rho = 0.4;            % 分辨系数

% cankao = byy(:, 9);
% t = repmat(cankao, [1, n]) - byz(:,:) ;
% mmin = min(min(abs(t)));
% mmax = max(max(abs(t)));
% xishu = (mmin + rho .* mmax) ./ (t +rho .* mmax);
% guanliandu = mean(xishu)
% [gsort, ind] = sort(guanliandu, descend)

i = 9;
flag = zeros(19, 1);
while index <= 18
        cankao = byy(:, i);
        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(2);
        index = index + 1;
        paixu(index) = i;
end

%
%  9    15    13    16     4    11     3    17     2     5     6    10   14    19    12     8    18     1     7
%  4     7     3     8    16    19    12     1     6     2    10    14    11     9    13    15    18   17     5


% 通过 系数的排序进行合成图片,在此之前,无论用什么方法,只需要求出关于关联系数的排序就好了
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源程序

标签:源程序   one   ima   灰色   class   定义   max   esc   过程   

原文地址:http://www.cnblogs.com/douzujun/p/7400956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!