从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)
相关推荐
周杰伦_Jay10 分钟前
【 RocketMQ 全解析】分布式消息队列的架构、消息转发与快速实践、事务消息
分布式·算法·架构·rocketmq·1024程序员节
sprintzer22 分钟前
10.16-10.25力扣计数刷题
算法·leetcode
王哈哈^_^31 分钟前
【数据集】【YOLO】【目标检测】建筑垃圾数据集 4256 张,YOLO建筑垃圾识别算法实战训推教程。
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·数据集
CoovallyAIHub1 小时前
不看异常,怎么学会识别异常?用“异常”指导异常检测!——NAGL方法解析(附代码地址)
深度学习·算法·计算机视觉
共享家95271 小时前
数据结构-并查集
数据结构·c++·算法
IT古董2 小时前
【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(2)理解粗排模型之离线部分:双塔模型结构精讲及实现
人工智能·算法·计算机视觉
茉莉玫瑰花茶2 小时前
贪心 - 后篇
算法
m0_748233642 小时前
【C++篇】C++11入门:踏入C++新世界的大门
java·c++·算法
lxmyzzs2 小时前
【图像算法 - 31】基于深度学习的太阳能板缺陷检测系统:YOLOv12 + UI界面 + 数据集实现
人工智能·深度学习·算法·yolo·缺陷检测
lxmyzzs2 小时前
【图像算法 - 32】基于深度学习的风力发电设备缺陷检测系统:YOLOv12 + UI界面 + 数据集实现
深度学习·算法·yolo·计算机视觉