从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)
相关推荐
会员源码网9 小时前
使用`mysql_*`废弃函数(PHP7+完全移除,导致代码无法运行)
后端·算法
木心月转码ing10 小时前
Hot100-Day10-T438T438找到字符串中所有字母异位词
算法
HelloReader11 小时前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱14 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng89715 小时前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮1 天前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员1 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱1 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者2 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶