这是我参加数模培训的第一次作业,收获颇多,想记录一下值得被记录的知识点。
小知识
读取图片
imread函数: MATLAB中读取图片的常用函数,用法:
A = imread(‘filename’)
其中,A为返回的数组,用于存放图像中的像素矩阵
输出图片
imshow(I,[low high])
显示灰度图像 I,以二元素向量 [low high] 形式指定显示范围。ps灰度图:灰度图由单个像素点通过8位的灰度值(0-255)来表示
clc, clear, close all
a1=imread('000.bmp');
[m,n]=size(a1);
imshow(a1);%显示图像
拼图思路
- 获取单个图片的数据
- 将所有图片的数据放入一个三维数组里
- 找到第一张图的位置后将其图片换到数组的第一张
- 然后通过计算相关系数找后续图片
- 输出完整图片
代码部分
a1=imread('000.bmp');
[m,n]=size(a1); %获取图片数据
dirname = 'ImageChips';
files = dir(fullfile(dirname, '*.bmp')); %获取该文件夹所有的图片
a=zeros(m,n,19); %19是图片数量
for ii = 1:length(files)
filename = fullfile(dirname, files(ii).name);
a(:,:,ii)=imread(filename);
end
%从19张中找到最左边的图
b=a/255; %将数据归一化
v=zeros();
for i=1:19
x=b(:,1,i); %取每个图的左边的数据
v(i)=sum((x-mean(x)).^2)/(length(x)-1); %求方差
end
[~,q]=min(v); %获取第一张图的序列
%将第一个与第q个图转换位置
y(:,:,1)=b(:,:,1);
b(:,:,1)=b(:,:,9);
b(:,:,9)=y(:,:,1);
%通过计算相关系数来找后续图片
s=zeros();
for i=1:17
for j=1:19
x1=b(:,72,i); %第i个图片的最后一列(右边)的数据
y1=b(:,1,j); %第j个图片的第一列(左边)的数据
s(j)=diag(corrcoef(x1,y1),-1); %将相关系数存入数组中
end
[~,c]=max(s); %找最大值的位置
%将图片换位置
y(:,:,1)=b(:,:,i+1);
b(:,:,i+1)=b(:,:,c);
b(:,:,c)=y(:,:,1);
end
b=reshape(b,[m,n*19]); %把三维数组转换为二维
imshow(b,[])