【问题标题】:efficient implementation of neighbor difference calculation in matlabmatlab中邻域差计算的高效实现
【发布时间】:2013-12-17 01:27:49
【问题描述】:
我有 2D 图像数据,我想计算相邻像素之间的绝对差异。每个像素有 8 个邻居(上下、左右和对角线),我需要将结果记录在一维向量中。
现在我首先创建一个边缘对 (i,j) 列表,其中 i 和 j 是像素位置的索引。例如,3x3 图像中的像素被标记为 1 到 9,这定义了 i 和 j 的范围。然后我遍历所有边对来计算差异。问题是这非常慢,因为图像中有很多边缘。
有没有更好的方法来做到这一点?非常感谢。
【问题讨论】:
标签:
matlab
image-processing
graph
nearest-neighbor
【解决方案1】:
您想记录一次或两次差异吗?如果您计算每个像素 8 个差异,那么您将记录每个差异两次:一次在 i 和 j 之间,一次(相同的绝对差异)在 j 和 i 之间。
这是 2D 图像的无循环选项I
d1 = abs( I(:,1:end-1) - I(:,2:end) ); % difference left-right
d2 = abs( I(1:end-1,:) - I(2:end,:) ); % diff up
d3 = abs( I(1:end-1,1:end-1) - I(2:end,2:end) ); % 1st diagonal
d4 = abs( I(1:end-1,2:end) - I(2:end,1:end-1) ); % 1st diagonal
allDiff = [d1(:); d2(:); d3(:); d4(:) ]; % stack them together.
【解决方案2】:
以这种方式计算如何使边缘像素和相应的水平像素之间产生绝对差异并满足阈值例如 1,2,3..... 并存储水平像素的值
同样的方式也满足水平对面并执行与上述相同的方法。
假设边缘像素 I(i,j) 然后 I(i,j+r) 水平像素和 I(i,j-r) 垂直像素