目的:将一张被纵向等距切割成19份的碎纸片复原。
解题思路:
1.预处理。
批量导入图片转化为矩阵,按序将碎纸片的首列向量和末列向量分别存储首矩阵和末矩阵。
2.找开头。
通过纸片边缘的空白确定“头”(左边第一张碎纸片)。通过头所在的序列号索引到相应的末矩阵列。
3.相似度。
确认末矩阵的列,在首矩阵中找到最相似的列,再通过头确定尾。按序索引图片进行拼接。
复原效果图:![7125445ddafb4483ae1331cf1c01af2a.png](https://img-blog.csdnimg.cn/direct/7125445ddafb4483ae1331cf1c01af2a.png)
源码
clear;close all;
A = zeros(1980,1368);
C = 0;
imstart = zeros(1980,19);
imend = zeros(1980,19);
%% 设置文件夹路径
folder_path = 'C:\Users\Desktop\paper19';
% 获取文件夹中的所有图像文件
file_list = dir(fullfile(folder_path, '*.bmp')); % 根据需要修改文件扩展名
%% 循环处理每个图像文件
for i = 1:numel(file_list)
% 读取图像
img = imread(fullfile(folder_path, file_list(i).name));
% 将图像转换为矩阵
matrix = double(img);
imstart(:,i) = matrix(:,1);
imend(:,i) = matrix(:,72);
% 在此处添加你想要的处理步骤
end
%%找到第一张图片
for i = 1:numel(file_list)
if imstart(:,i) == 255
A(:,1:72) = double(imread(fullfile(folder_path, file_list(i).name)));
C = i;
break
end
end
%% 识别储存后续图片
for j=2:numel(file_list)
mindis = norm(imend(:,C) - imstart(:,1));
minIndex = 1;
for i = 2:numel(file_list)
distance1 = norm(imend(:,C) - imstart(:,i));
if distance1 < mindis
mindis = distance1;
minIndex = i;%保留索引
end
end
start_col = 72 * j - 71;
end_col = 72 * j;
A(:,start_col:end_col) = double(imread(fullfile(folder_path, file_list(minIndex).name)));
C = minIndex;
end
%% 显示图片
imNew = uint8(A);
imshow(imNew, []);