矩阵中一个点周围元素差异的总和

时间:2018-01-26 14:30:23

标签: c++ opencv octave convolution

我正在尝试重写和加速我的代码。 基本上我有一个矩阵,我必须为矩阵中的每个元素计算该元素周围相邻元素的差异总和。例如,对于这种3x3矩阵,我应该得到:

1 2 3
4 5 6 
7 8 9

(1-2)+(2-3)+(3-6)+(6-9)+(9-8)+(8-7)+(7-4)+(4-1)

我知道这种类型的总和我可以通过使用内核卷积

轻松执行
1 1 1
1 0 1
1 1 1

但是我必须首先以某种方式执行子结构。我已经用octave编写了一个代码来执行这个操作,但效率非常低,所以我试图用openCV转移到c ++并加快这个过程。

我的问题是,有没有办法使用某种矩阵运算来执行此操作而不是强力求和?

当前有效的八度音程

function deltaPhi = phaseDifference(phi1, phi2)
  deltaPhi = phi1 - phi2;
  if(deltaPhi > pi)
    deltaPhi = deltaPhi - 2*pi;
  endif

  if(deltaPhi < -pi)
    deltaPhi = deltaPhi + 2*pi;
  endif;

end

function [phase] = checkPhase(M)

phase = zeros(size(M)-2);


  for i = 2:size(M,1)-1
    for j = 2:size(M,2)-1      
      phase(i-1,j-1) = phaseDifference(M(i-1,j-1),M(i,j-1)) + phaseDifference(M(i,j-1),M(i+1,j-1)) + phaseDifference(M(i+1,j-1),M(i+1,j)) + phaseDifference(M(i+1,j),M(i+1,j+1)) + phaseDifference(M(i+1,j+1),M(i,j+1)) + phaseDifference(M(i,j+1), M(i-1,j+1)) + phaseDifference(M(i-1,j+1), M(i-1,j)) + phaseDifference(M(i-1,j), M(i-1,j-1));
    endfor
 endfor

end

1 个答案:

答案 0 :(得分:0)

如果您对公式中的正面和负面项目进行分组,您会发现它们都相互抵消,因此结果始终为0.

(1-2)+(2-3)+(3-6)+(6-9)+(9-8)+(8-7)+(7-4)+(4-1) 

     (1+2+3+6+9+8+7+4) - (2+3+6+9+8+7+4+1) 

                       0

相反,如果你想要相邻像素的差异,你可能想要使用一些现有的内核(用于边缘检测,模糊,锐化......)

查看HERE以查看最常用的内核及其执行的操作