我想找到一张图片与我拥有的一些样本(黑白)有多相似。 我使用绝对差值代码的总和,但因为我是MATLAB的新手,所以我没有找到如何使用它。这个算法是如何工作的?它是否可以衡量照片的相似程度?
I= imread('img1.jpg');
image2= imread('img2.jpg');
% J = uint8(filter2(fspecial('gaussian'), I));
K = imabsdiff(I,image2);
figure, imshow(K,[])
答案 0 :(得分:5)
我认为你自己几乎已经回答了你的问题。它是绝对差值的总和。因此,假设您有img1
和img2
,它们的大小和类型相同。
要找出差异,请进行减法
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
```
...享受