2012-06-19 27 views
0

im正在处理图像double(800x450x3),如果它保存某些条件,我想更改像素的值。然而,我第一次使用的代码,给了我一个很好的形象。当我试图优化它时,如果在前一种情况下根本没有它们,图像会变得非常奇怪(红色/紫色/蓝色等)。优化在MATLAB中提供了不正确的图像

,我首先代码:

diff = abs(double(rgbimage) - double(backgroundImage)); 
fusion = zeros(size(currentFrame)); 
for i=1:size(backgroundImage,1) 
    for j = 1:size(backgroundImage,2) 

     if diff(i,j) > 20 

     fusion(i,j, :) = double(rgbimage(i,j, :)); 

     else 
     fusion(i,j, :) = 0; 

     end 
    end 
end 

,我又把它优化:

diff = abs(double(rgbimage) - double(backgroundImage)); 
    fusion = zeros(size(currentFrame));  
    indexes = diff > 20; 
    fusion(indexes) = double(rgbimage(indexes)); 

...我只是绘制

subplot(2,1,1), subimage(uint8(fusion)); 
    title('Fusion'); 

后有什么区别,为什么我得到这个错误? 谢谢!

+2

它是一个坏主意,以命名您的变量差异,因为那么函数差异将会发生冲突。 – 2012-06-19 14:02:14

回答

2

你的两种方法不同的原因是你在for-loop版本中只使用差异图像的第一个“图层”(我会猜测红色成分?)。您的行if diff(i,j) > 20被解释为if diff(i,j,1) > 20。如果第三个坐标未在查找中定义,则默认为1

优化后的代码逐个比较三维数据结构的所有元素。这就是为什么你会得到“怪异”的颜色。差异检查因此在每个像素中进行,并且不考虑颜色分量。

尝试用你的优化版本这样做:

diff = abs(double(rgbimage) - double(backgroundImage)); 
fusion = zeros(size(currentFrame)); 
indexes = cat(... 
    3, ... 
    diff(:,:,1) > 20, ... 
    diff(:,:,1) > 20, ... 
    diff(:,:,1) > 20 ... 
); 
fusion(indexes) = double(rgbimage(indexes)); 

现在,这应该给了相同的结果for循环的版本。

+1

'repmat(diff(:,:1)> 20,[1 1 3])'会更干净。 – tmpearce

+0

当然:)你的其他细节已被删除。所以我删除了我的长评。 –

0
  1. 我建议代替减去图像手动使用,imsubtract 内部函数。 (从另一个图像中减去一个图像或从图像中减去 常量)。 Z = imsubtract(X,Y)从数组X中的相应元素中减去数组Y中的每个元素,并返回输出数组Z中相应元素的差异。X和 Y是相同的真实非稀疏数值数组大小和类别,或者是 Y是双标量。返回的数组Z具有与X相同的大小和类,除非X是逻辑的,在这种情况下,Z是双精度值。

  2. 不要手动转换图像,以双类型,并使用im2double 内部功能:I2 = im2double(I)的强度图像转换我 到双精度,重新缩放的数据,如果必要的。

  3. 您也可以使用发现功能,[行,列,V] =找到(X,...)返回X中的非零项的 列或行向量v,以及行 和列指数。如果X是一个逻辑表达式,那么v是一个 逻辑阵列。输出v包含通过评估表达式X获得的逻辑数组的非零元素。

    [r,c,v] = find(diff> 20);

相关问题