我正在尝试重写和加速我的代码。 基本上我有一个矩阵,我必须为矩阵中的每个元素计算该元素周围相邻元素的差异总和。例如,对于这种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
答案 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以查看最常用的内核及其执行的操作