用Matlab解《2013年数据建模比赛》图像碎片拼接题

摘要: matlab,数学建模,碎片拼接

  额,最近抠c++抠累了,突然心血来潮翻看近年来的大学生数学建模题。相比当年参加比赛的题目,总体感觉现在的题目越来越接近生活了。可能是多了一些经历,对一些题特别有感觉,加之联想起以前做完一道难题得到的兴奋感,一个想法涌上心头,为什么不利用现在的知识来好好“收拾收拾”它们呢。因此便有了这篇的文章,一方面是分享下自己的想法,另外也是锻炼下自己的文笔,身为程序猿,是时候改变一下一些习惯了。选出特别感兴趣的题目《2013年数学建模B赛题-图像碎片拼接》,开弄!

  题目链接:http://www.mcm.edu.cn/html_cn/block/8579f5fce999cdc896f78bca5d4f8237.html

  题目按切割方式不同归类为三个子问题:单面纵切,单面纵横切,双面纵横切,其中前两个又分为中英文纸张的情况,三个问题依次越来越复杂,越来越接近实际情况。不过相较于生活中的问题,《女子将5万钞票撕成碎片续:丈夫辞职在家拼钱》,http://news.qq.com/a/20120506/000091.htm,建模题还是比较小儿科的。

  单面纵切:可以理解为对n个碎片块进行“行内”排列组合,最终要求是使碎片边界无缝接合起来。排列组合的话可以用神经网络,遗传算法等智能算法实现,“无缝”需要一个量来表征。前面智能算法对碎片不同组合时的无缝量进行评估,之后得到的最优解。这是学院派的解法,以此思路进行下去,一篇华丽的文章就可以出炉了。另外两个子问题也可以作类似的分解。

  下面是我实现的解法,以前面方法相比,这种方法有些“简单粗暴”,先上matlab代码先(复制后放在相应的文件夹里运行即可):

clear all;clc;close all
%% 碎片拼接
file_list= dir(‘*.bmp‘); % 获取文件列表
if size(file_list,1)>0
    image_list = {file_list.name};
else
    error(‘no image‘)
end
file_num=size(image_list,2);
score=zeros(1,file_num);
feature=cell(1,file_num);
for ind=1:file_num % 计算碎片特征
    filename=cell2mat(image_list(ind));
    a=imread(filename);
    [row,col,len]=size(a);
    if len==3
        a=rgb2gray(a);
    end
    a_d=double(a);

    f=a_d(:,1)‘;
    tmp1=f.*f;
    tmp2=sqrt( sum(tmp1) );
    f=f/tmp2;
    one.left=f;
    one.left_std=std(f);

    f=a_d(:,end)‘;
    tmp1=f.*f;
    tmp2=sqrt( sum(tmp1) );
    f=f/tmp2;
    one.right=f;
    one.right_std=std(f);

    feature{ind}=one;
end
%% 计算碎块的相似性矩阵
score_left=zeros(file_num,file_num);
score_right=zeros(file_num,file_num);
std_thr=0.001;
for y=1:file_num % compare
    for x=1:file_num
        if y==x
            continue;
        end
        score_left(y,x)=feature{y}.left*feature{x}.right‘;
        score_right(y,x)=feature{y}.right*feature{x}.left‘;
        if feature{y}.left_std<std_thr
            score_left(y,x)=0;
        end
        if feature{y}.right_std<std_thr
            score_right(y,x)=0;
        end
    end
end
%% 计算块间相似性
order=[1];
order_left=2:file_num; % order,第一个保证前后都有对象
while 1
    order
    if isempty(order_left)
        break;
    end
    left=order(1);right=order(end);
    score=score_left(left,:);
    [c,i]=max(score);
    if c(1)>0.95 && any(order_left==i(1))
        order=[i order];
        order_left(order_left==i(1))=[];
    end
    score=score_right(right,:);
    [c,i]=max(score);
    if c(1)>0.95 && any(order_left==i(1))
        order=[order i];
        order_left(order_left==i(1))=[];
    end
end
%% 拼接
b=[];
for ind=1:file_num % 拼接
    filename=cell2mat(image_list(order(ind)));
    a=imread(filename);
    [row,col,len]=size(a);
    if len==3
        a=rgb2gray(a);
    end
    b=[b a];
end
%% show
imshow(b)

  大概的思路是先计算块的特征,然后计算块间的相似性,最后进行拼接。其实看代码更容易理解,其中的无缝量选择,可以应用在前面方法的实现里。

拼接后的效果图:

中文:                                                                                英文:

           

~~Yemuzi分享文章,欢迎拍砖~~

时间: 2024-10-29 19:10:27

用Matlab解《2013年数据建模比赛》图像碎片拼接题的相关文章

MATLAB解灰色模型

目前,灰色模型已经成为社会.经济.科教.技术等很多领域进行预测.决策.评估.规划.控制.系统分析和建模的重要方法之一.特别是它对时间序列短.统计数据少.信息不完全系统的建模与分析,具有独特的功效. 其实灰色模型很简单,具体的步骤我就不再一一赘述,我就灰色模型用MATLAB的解法与大家分享一下.我以一组简单的数据为例,如下: 例: 近几年,某种商品的价格如下表: 年份 2006 2007 2008 2009 2010 2011 2012 价格 71.1 72.4 72.4 72.1 71.4 72

matlab读取指定路径下的图像

利用matlab读取指定路径下的图像 %% 读入指定路径imgFolder下的图像imgName imgFolder = 'F:\博\快盘\图像+数据\images\文章实验图'; %指定路径 imgName = 'tile3_24.png'; %指定路径下的图像的名字 % read the image imgInput= imread(fullfile(imgFolder,imgName)); %读入图像

hdu 1285 确定比赛名次 (模板题)

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11353    Accepted Submission(s): 4525 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接

HDU 4791 Alice&#39;s Print Service(2013长沙区域赛现场赛A题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 解题报告:打印店提供打印纸张服务,需要收取费用,输入格式是s1 p1 s2 p2 s3 p3...表示打印区间s1到s2张纸的单价是p1,打印区间s2 到s3的单价是p2....最后是sn到无穷大的单价是pn,让你求打印k张纸的总费用最少是多少?有m次查询. 因为s1*p1 > s2 * p2 > s3*p3......,很显然,加入k所在的那个区间是第x个区间,那么最低费用要么是k * p

2013 ACM/ICPC 长沙现场赛 A题 - Alice&#39;s Print Service (ZOJ 3726)

Alice's Print Service Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice is providing print service, while the pricing doesn't seem to be reasonable, so people using her print service found some tricks to save money. For example, the price when

基于jQuery图像碎片切换效果插件FragmentFly

基于jQuery图像碎片切换效果插件FragmentFly.这是一款只需三步轻松完成碎片动画,参数可调,使用方便. 在线预览   源码下载 部分代码: <div class="all_wrap"> <div class="wrap_head"> <div id="fragment_title"> </div> </div> <div class="wrap_middle&

【数值分析】误差的分析与减少及Matlab解线性方程的四种方法

1.误差的来源 模型误差:数学模型与实际问题之间的误差 观测误差:测量数据与实际数据的误差 方法误差:数学模型的精确解与数值方法得到的数值解之间的误差:例如 舍入误差:对数据进行四舍五入后产生的误差 2.减少误差的几种方法 现在,我们一般用计算机解决计算问题,使用最多的是Matlab软件.对实际问题进行数学建模时,可能存在模型误差,对数学模型进行数值求解时,我们使用的方法可能产生方法误差,我们输入计算机的数据一般是有测量误差的,计算机在运算过程的每一步又会产生舍入误差(十进制转化为二进制时可能产

MATLAB学习笔记(七)&mdash;&mdash;MATLAB解方程与函数极值

(一)线性方程组求解 包含n个未知数,由n个方程构成的线性方程组为: 其矩阵表示形式为: 其中 一.直接求解法 1.左除法 x=A\b; 如果A是奇异的,或者接近奇异的.MATLAB会发出警告信息的. 2.利用矩阵的分解来求解线性方程组(比单单进行左除速度快) (1)LU分解 LU分解就是分解成一个交换下三角矩阵(也就是说进行一定的操作后才是下三角矩阵)和一个上三角矩阵(不需要变换)的乘积形式.只要A是非奇异的,就可以进行LU分解. MATLAB提供的LU分解函数对于矩阵进行LU分解: [L,U

matlab自学笔记(3)—图像绘制与图像处理

1.绘制函数的图像 在matlab中绘制函数的图像大概可以分为三步,1.定义函数:22.制定取值范围:3.调用plot(x,y)函数. 例如我们绘制 y =  sin (x)的图像,可以使用如下的代码: 当然,我们还可以对图像进行一些优化与处理,比如为坐标轴加上标签,加上网格等.直接看代码及效果: x = [0:0.1:10]; y = sin(x); plot(x,y),xlabel('x'),ylabel('sin(x)'),legend('x'),grid on; %xlabel()是显示