任务:在下面两幅图像中找不同,并将不同之处标出来。提示:两幅图像没有对齐(有一定的平移量);首先通过算法对齐图像。
- 算法原理:
使用图像的互相关来找到图像之间的平移量。图像的互相关是一种用于比较两幅图像之间相似度的数学操作。互相关首先将两幅图像转换为灰度图像,以便进行灰度级别的比较。对其中一幅图像进行翻转操作。将翻转后的图像与另一幅图像进行卷积,计算在每个位置上的像素值的乘积之和。得到的互相关结果矩阵表示了两幅图像在不同位置上的相似度。
- 解题步骤
1.将两幅图像转换为灰度图像,使用rgb2gray函数将彩色图像转换为灰度图像。
2.计算第一幅图像和第二幅图像之间的互相关函数。使用normxcorr2函数计算两幅灰度图像的归一化互相关函数,计算它们之间的相似度。
3.找到互相关函数的峰值,即找到最大值和其对应的位置。max函数用于找到互相关函数矩阵corrMatrix中的最大值maxValue,maxIndex用于记录最大值的索引。使用ind2sub函数将最大值的索引转换为行列坐标,得到maxRow和maxCol。
4.计算平移量,将第二幅图像平移使其与第一幅图像对齐。平移量的计算是通过将最大值的坐标减去第二幅图像的大小得到的。
5.使用imtranslate函数对第二幅图像进行平移变换,将其与第一幅图像对齐。
根据找到的峰值位置计算平移量。平移量可以表示为在水平和垂直方向上的像素偏移量。
6.计算图像1和对齐后的图像2的差异,显示在图形窗口中。
- 程序代码
clc;
clear all;
close all;
% 读取两幅图像
image1 = imread('q1_painting_1.jpg');
image2 = imread('q1_painting_2.jpg');
% 将图像转换为灰度图像
grayImage1 = rgb2gray(image1);
grayImage2 = rgb2gray(image2);
% 计算归一化互相关函数
corrMatrix = normxcorr2(grayImage2, grayImage1);
% 找到互相关函数的峰值
[maxValue, maxIndex] = max(corrMatrix(:));
[maxRow, maxCol] = ind2sub(size(corrMatrix), maxIndex);
% 计算平移量
shiftRow = maxRow - size(grayImage2, 1);
shiftCol = maxCol - size(grayImage2, 2);
% 应用平移变换对齐图像
alignedImage2 = imtranslate(image2, [shiftCol, shiftRow]);
% 显示对齐后的图像
figure;
subplot(1, 2, 1);
imshow(image1);
title('图像1');
subplot(1, 2, 2);
imshow(alignedImage2);
title('对齐后的图像2');
%
I2 = image1-alignedImage2;
figure;
imshow(I2);
title('图像1与图像2的区别');
diffImage = imabsdiff(image1, alignedImage2);
resultImage = image1 + diffImage*20;
figure;
imshow(resultImage);
title('图像1中的差异部分');
- 处理结果
图1和对齐后的图二如下图所示。
图1和图2之间的像素平移量如下所示。
将图像相减,计算图像1和对齐后的图像2的差异,如下所示。
由于上图显示结果比较暗,看起来不清晰,所以把差异增大,即变亮显示在图1中,结果如下。