两幅图像的绝对差值之和

时间:2014-02-22 21:05:10

标签: matlab image-processing

我想找到一张图片与我拥有的一些样本(黑白)有多相似。 我使用绝对差值代码的总和,但因为我是MATLAB的新手,所以我没有找到如何使用它。这个算法是如何工作的?它是否可以衡量照片的相似程度?


I= imread('img1.jpg');

image2= imread('img2.jpg');


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

K = imabsdiff(I,image2);

figure, imshow(K,[])

3 个答案:

答案 0 :(得分: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(:))

答案 1 :(得分:1)

最佳实践是使用MATLAB的内置函数imabsdiff。与其他建议的答案相反,如果您将图像格式设置为uint8,则它会注意范围边界。考虑:

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

给你0,而

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

正确给出10。

答案 2 :(得分:0)

你应该在MATLAB中使用命令im2col,你可以用矢量化方式这样做 只需在列中排列每个邻域(对于每个帧) 将它们放入3D Matrix并在第3维上应用您的操作。

代码段

我使用了维基百科对“Sum of Absolute Differences”的定义。

演示脚本:

```

% 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

```

...享受