从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)
相关推荐
Swift社区1 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman2 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年2 小时前
数据结构 (1)基本概念和术语
数据结构·算法
Dong雨3 小时前
力扣hot100-->栈/单调栈
算法·leetcode·职场和发展
SoraLuna3 小时前
「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
开发语言·算法·macos·cangjie
liujjjiyun3 小时前
小R的随机播放顺序
数据结构·c++·算法
¥ 多多¥3 小时前
c++中mystring运算符重载
开发语言·c++·算法
trueEve4 小时前
SQL,力扣题目1369,获取最近第二次的活动
算法·leetcode·职场和发展
天若有情6734 小时前
c++框架设计展示---提高开发效率!
java·c++·算法
ahadee5 小时前
蓝桥杯每日真题 - 第19天
c语言·vscode·算法·蓝桥杯