两幅图像的绝对差值之和

3

我想找出一张图片与我拥有的一些样本(黑白)有多相似。

我使用的是绝对差值和代码,但由于我刚接触MATLAB,我还不知道如何使用它。这个算法是如何工作的?它能给出图片之间的相似度吗?


I= imread('img1.jpg');

image2= imread('img2.jpg');


% J = uint8(filter2(fspecial('gaussian'), I));

K = imabsdiff(I,image2);

figure, imshow(K,[])

1
如果你的问题是如何使用绝对差之和:1. 维基百科页面 和 2. imabsdiff文档 - chappjc
"imabsdiff" 正如文档所述,功能确实如此。您如何定义相似度指标,以及您如何使用绝对差异,完全取决于您自己 - "sum(K(:))" 是其中一种选项。 - Notlikethat
我认为这个函数主要用于视频的连续帧。这样你就可以知道两个连续帧之间存在多少运动。否则,这种差异可能不是一个好的标准。 - Mohammad
3个回答

5

我认为你已经基本回答了自己的问题,这是绝对差值的总和。假设你有相同大小和类型的img1img2.

要找到它们之间的差异,请进行减法操作。

img1-img2

要找出绝对差,请使用绝对值函数abs
abs(img1-img2)

要计算总和,使用sum函数。请注意,您需要为图像的每个“维度”执行此操作。如果您不确定,请键入size(img1)并查看是否出现2个或3个数字,这对应于您需要使用多少个sum(...)
对于彩色图像(3维):
sum(sum(sum(abs(img1-img2)))) 

^^ 是绝对差的总和。无论哪个图像的总和最小,都可以视为最接近的图像。

如果你有不同大小的图像,需要使用 normxcorr2 函数。该函数将返回一个矩阵,其中显示了模板(小)图像在不同点上适合大图像的程度。找到该矩阵的最大值,即可确定该图像的适合程度。

例如:

correlation = normxcorr2(smallImg, bigImg);
compareMe = max(correlation(:))

3
我建议使用sum(abs(img1(:)-img2(:)))作为更简单的方法,但仍然是个好答案。 - chappjc
我尝试使用这个方法,但是我遇到了一个问题,我认为可能是图像大小的问题...但我不知道。??? 使用==>减号时出错 矩阵维度必须相同。错误位于:sad at 4 sum(abs(image1(:)-image2(:))) - user3185256
这是因为您的图像大小不同。我添加了如何处理不同大小的图像,但请注意,这会增加计算成本。感谢chappjc提供img1(:),更易于阅读。 - Shaun314

1

最佳实践是使用MATLAB的内置函数imabsdiff。与其他建议的答案相比,如果您的图像格式为uint8,它会处理范围边界。考虑以下内容:

img1 = uint8(10);
img2 = uint8(20);
sum(abs(img1(:)-img2(:)))

gives you 0, whereas

imabsdiff(img1(:),img2(:))

正确地给出了10。


0

在MATLAB中,你应该使用命令im2col来以向量化的方式进行操作。
只需将每个邻域按列排列(对于每个帧)。
将它们放入3D矩阵中,并在第三维度上进行操作。

代码片段

我使用了维基百科关于“绝对差值之和”的定义。

演示脚本:

```

% Sum of Absolute Differences Demo

numRows = 10;
numCols = 10;

refBlockRadius = 1;
refBlockLength = (2 * refBlockRadius) + 1;

mImgSrc     = randi([0, 255], [numRows, numCols]);
mRefBlock   = randi([0, 255], [refBlockLength, refBlockLength]);

mSumAbsDiff = SumAbsoluteDifferences(mImgSrc, mRefBlock);

```

SumAbsoluteDifferences函数:

```

function [ mSumAbsDiff ] = SumAbsoluteDifferences( mInputImage, mRefBlock )
%UNTITLED2 Summary of this function goes here
%   Detailed explanation goes here

numRows = size(mInputImage, 1);
numCols = size(mInputImage, 2);

blockLength = size(mRefBlock, 1);
blockRadius = (blockLength - 1) / 2;

mInputImagePadded = padarray(mInputImage, [blockRadius, blockRadius], 'replicate', 'both');

mBlockCol = im2col(mInputImagePadded, [blockLength, blockLength], 'sliding');

mSumAbsDiff = sum(abs(bsxfun(@minus, mBlockCol, mRefBlock(:))));

mSumAbsDiff = col2im(mSumAbsDiff, [blockLength, blockLength], [(numRows + blockLength - 1), (numCols + blockLength - 1)]);


end

```

享受...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接