当你在八度音中减去两行时会发生什么?

时间:2014-07-05 18:36:24

标签: octave

我在理解这段代码时遇到了一些麻烦:

img=imread(“test.jpg”); 
c=0; 
for i=img 
   for j=1:rows(i)-1 
      c+=uint64(abs(i(j)-i(j+1))); 
   endfor 
endfor 
c 

img是一个三维数组MxNx3Color,每种颜色从1到255 我不明白的是:i(j)-i(j + 1) 它确实成像行n - 想象行n + 1

但是当你减去2行时会发生什么? 例如,有两个3维行(我猜一行是图片中的一行,所以这里代表一个3像素宽的图片):

row1 : |[125, 128, 255] [055, 011, 200] [078, 200, 159]] 
row2 : |[225, 144, 111] [120, 128, 050] [123, 122, 111]] 

row1 - row2是什么产生的? 最后,我想在java中实现它。

由于

修改

好吧,根据这个链接,操作很简单:

http://www.philender.com/courses/multivariate/notes/matoctave.html

A =
   2   1
   3   2
  -2   2

  B =
   1   1
   4   2
  -2   1

octave: D = A - B
D =
   1   0
  -1   0
   0   1

但仍然有一件事我不明白,结果,这是一个matric然后变成一个常规数字,那是什么样的魔法? (c + =行 - 行)

1 个答案:

答案 0 :(得分:1)

仔细了解上面的代码。外循环遍历所有列,这意味着它遍历第一维和第三维。内循环遍历第二维,所以基本上代码迭代所有像素并将差异总结为下面的像素。

典型的matlab-ish解决方案是:

 sum(sum(sum(abs(diff(I,1,1)))))

对于横向版本,您可以使用:

sum(sum(sum(abs(diff(I,1,2)))))

从内到外阅读,获得第一(第二)维度之间的差异,得到绝对值,总结所有三个维度。

您正在寻找可以转换为java的代码,因此这里是一个完全迭代的解决方案,它不使用for循环的任何高级功能:

c=0;
for row=1:size(I,1)-1
    for column=1:size(I,2)
        for color=1:3
            c=c+abs(I(row,column,color)-I(row+1,column,color));
        end
    end
end

(用MATLAB编写但与octave完全兼容的代码)