从2013数学建模B题碎纸片拼接问题看递归和迭代思想

目录

1.递归实例说明

2.迭代实例说明

3.迭代思想在碎纸片拼接赛题的运用


1.递归实例说明

斐波那契数列可以使用递归,也可以使用数列的通项公式,但是这个地方建议使用数列的通项公式,因为这个递归的深度过大这个结果很难运行出来;

1-100数据求和,这个也是不断的进行递归的过程,我们是自己定义了一个函数,然后在另外一个文件里面去调用这个函数,100+sum(99),然后这个99回去调用99+sum(98),就按照这个顺序不断地递归下去就可以了;

2.迭代实例说明

迭代求解方程的根的取值,利用的就是零点的存在性定理;

3.迭代思想在碎纸片拼接赛题的运用

关于这个赛题的详细的信息可以去数学建模的官网上面去寻找,就是碎纸片的拼接问题,这个结合该赛题介绍迭代递归的思想的运用;

刚开始就是去读取这个份碎片的相关的信息,这个是利用的循环对于这个图片的索引进行相关的命名,url就是这个图片的相关的地址,顺着这个地址,我们可以直接去找到这个图片的相关的信息;

因为这个matlab的索引是从1开始的,所以我们在设计这个读取数据信息的时候,第一个参数图片的编号,是从1开始的,所以我们把这个j+1作为这个matlab里面的索引,让这个索引符合matlab的编程规范;

f就是一个三维数组,第一个参数表示的就是这个图片的编号,第二个表示这个图片的行数,第三个表示这个图片的列数,我们可以把这个f三维数组理解为这个空间里面的三维坐标;

hs就是读取这个图片的行数,ls就是读取这个图片的列数,hs求解的时候第二个参数使用冒号表示的就是所有的行,第三个参数使用冒号表示的就是所有的列;

下面的还是一个for循环进行求解,两个sum函数,一个是对与外层求解,一个是对于内层求解,就是可以理解为这个显示对于每一行进行求和,再去对于这个得到的一维数组向量再次求和就可以知道这个图片的左边的两列的属性值,如果和hs*2*255相同就说明这个碎片是这个图片的最左边;

我们找到最左边的碎片之后,就需要找到这个最左边的图片色差最小的图片与之拼接,我们需要去挨个的进行判断,看一看哪一个碎片和我们的一致的碎片的这个色差的数值是最小的,比如我们的8号碎片可以去和最左边的拼接上,然后我们把这个1和8碎片作为基准,让上下的没有匹配上去的碎片进行匹配,这个不断的更新,不断地选择匹配的过程实际上就是一个迭代的过程;

把筛选的图片的信息同步到一个拼接矩阵里面去,最后使用循环的方式把这个图片放到fig_all这个矩阵里面,使用imshow函数把这个图像信息显示出来;

%2013B题的图片的拼接技术

clear%随书附带的第五章附件中的cx52.m

tpgs=19;%图片个数

for j=0:tpgs-1

    if(j<10)
            index=['00' num2str(j)];
    else
            index=['0' num2str(j)];
    end

    %当前路径下面的图片

    uri=['.\' index '.bmp'];         %获取图片地

    %matlab从1开始访问,所以这个就是1-19
    f(j+1,:,:)=imread(uri);          %读入图片

end

%读取的图像的行数
%第一个是编号信息,后面的两个参数表示的就是图像的行数和列数
hs=length(f(1,:,1));

%读取的图像的列数
ls=length(f(1,1,:));


%获取最左侧图片

pjjz=[];%拼接矩阵

for i=1:tpgs
    %每张图片的最左边的两列进行求和
    if sum(sum(f(i,:,1:2)))==hs*2*255  %图像最左侧两列为纯白色
        pjjz=[pjjz i];
    end
end


while length(pjjz)<tpgs
  sc=inf;%初始色差


  for i=1:tpgs

      %是拼接矩阵的元素
    if sum(i==pjjz)==0%在未拼接的图片中寻找
        fig_right=f(i,:,1);

        %pjjz(length(pjjz))表示拼接好的最右边的图片

        %ls是读取的图像的列数
        fig_left=f(pjjz(length(pjjz)),:,ls);
        x=[fig_right;fig_left]';

        x=double(x);%强制类型转换,否则无法计算相关度
        scx=sum(abs(x(:,1)-x(:,2)));
        %保留色差最小的图片的编号


      if scx<sc
            sc=scx;
            next_fig=i;
      end
    end
  end


  
  %把这个编号输入到这个拼接矩阵里面去
  pjjz=[pjjz next_fig];
end


fig_all=[];

for i=1:tpgs
    fig1(:,:)=[f(pjjz(i),:,:)];
    fig_all=[fig_all fig1];
end

%对于拼接之后的图像进行显示出来
imshow(fig_all)
相关推荐
浅念同学15 分钟前
算法.图论-并查集上
java·算法·图论
何不遗憾呢24 分钟前
每日刷题(算法)
算法
立志成为coding大牛的菜鸟.28 分钟前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode
鱼跃鹰飞29 分钟前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
liangbm335 分钟前
数学建模笔记——动态规划
笔记·python·算法·数学建模·动态规划·背包问题·优化问题
潮汐退涨月冷风霜40 分钟前
机器学习之非监督学习(四)K-means 聚类算法
学习·算法·机器学习
B站计算机毕业设计超人1 小时前
计算机毕业设计Python+Flask微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
爬虫·python·深度学习·算法·机器学习·自然语言处理·数据可视化
羊小猪~~1 小时前
深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)
人工智能·python·深度学习·学习·算法·机器学习·cnn
limingade4 小时前
手机实时提取SIM卡打电话的信令和声音-新的篇章(一、可行的方案探讨)
物联网·算法·智能手机·数据分析·信息与通信
jiao000016 小时前
数据结构——队列
c语言·数据结构·算法