Matlab中图像间绝对差值之和
我想在Matlab中实现绝对差之和,以在一个视频帧和该帧任一侧的5帧(即过去帧和未来帧)之间建立一个相似性度量。我只需要每个帧中共定位像素的SAD值,而不是完整搜索例程,例如完整搜索 显然,我可以将其实现为嵌套循环,例如:Matlab中图像间绝对差值之和,matlab,image-processing,video-processing,motion-detection,Matlab,Image Processing,Video Processing,Motion Detection,我想在Matlab中实现绝对差之和,以在一个视频帧和该帧任一侧的5帧(即过去帧和未来帧)之间建立一个相似性度量。我只需要每个帧中共定位像素的SAD值,而不是完整搜索例程,例如完整搜索 显然,我可以将其实现为嵌套循环,例如: bs = 2; % block size for (z_i = -bs:1:bs) for (z_j = -bs:1:bs) I1(1+bs:end-bs,1+bs:end-bs) = F1(1+bs+z_i:end-bs+z_i, 1+bs+z_
bs = 2; % block size
for (z_i = -bs:1:bs)
for (z_j = -bs:1:bs)
I1(1+bs:end-bs,1+bs:end-bs) = F1(1+bs+z_i:end-bs+z_i, 1+bs+z_j:end-bs+z_j);
I2(1+bs:end-bs,1+bs:end-bs) = F2(1+bs+z_i:end-bs+z_i, 1+bs+z_j:end-bs+z_j);
sad(:,:) = sad(:,:) + abs( I1(:,:) - I2(:,:));
end
end
但是我想知道有没有比这更有效的方法?至少我想我应该将上面的代码段定义为一个函数
如果您有任何建议,我们将不胜感激 您应该使用MATLAB中的命令,您将能够以矢量化的方式执行此操作。
只需将每个邻域排列成列(针对每个帧)。
将它们放在3D矩阵中,并在第三维上应用您的操作 代码片段 我使用了维基百科对“”的定义 演示脚本: ``` ``` 函数
SumAbsoluteDifferences
:
```
```
享受…这很有趣-我以前从未使用过im2col,我现在就试试。假设有一个反向函数将结果转换回2D数组?您可以查看我链接的函数页面
col2im
正好相反。我认为我矢量化代码的方式可能与使用im2col的方式一样快,甚至更快?有什么想法吗?我看到没有矢量化的循环。对不同的解决方案计时并告诉我们。也许我写im2col效率低下-你能用我可以使用的相关代码片段修改你的答案吗?我不理解你的代码<代码>I1(1:bs-1,:),I1(:,1:bs-1)
,I1(结束bs+1:end,:)
和I1(:,结束bs+1:end)
似乎未使用。你能给出你想要实现什么的数学定义吗?I1和I2用于计算下一行的SAD?在上面,SAD计算是矢量化的,因此整个帧是通过移动帧来计算的-因此在这种情况下25帧级计算(这里的块大小是5x5)是有意义的,但这不需要在每次迭代中将I1和I2设置为零吗?我不明白为什么会这样?假设我没有运行上面的代码段,但是在您填充I1(1,:)的第一次迭代中使用了非常类似的东西,那么这些值保持不变,并在每次迭代中添加它们。
% 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);
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