Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中图像间绝对差值之和_Matlab_Image Processing_Video Processing_Motion Detection - Fatal编程技术网

Matlab中图像间绝对差值之和

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_

我想在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_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