0

我正在处理图像双(800x450x3),如果它符合某些条件,我想更改像素的值。然而,我第一次拥有的代码可以工作并给我一个很好的形象。当我尝试优化它时,当我在前一种情况下根本没有它们时,图像会得到非常奇怪的颜色(红色/紫色/蓝色等)。

首先我有代码:

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');

有什么区别,为什么会出现此错误?谢谢!

4

2 回答 2

2

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

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

尝试使用您的优化版本执行此操作:

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 循环版本相同的结果。

于 2012-06-19T14:25:57.637 回答
0
  1. 我建议不要手动使用减去图像,而是使用 imsubtract internal function 。(从另一个图像中减去一个图像或从图像中减去常数)。Z = imsubtract(X,Y) 从数组 X 中的对应元素中减去数组 Y 中的每个元素,并返回输出数组 Z 中对应元素的差值。X 和 Y 是具有相同大小和类的实数、非稀疏数值数组, 或 Y 是双标量。返回的数组 Z 与 X 具有相同的大小和类,除非 X 是逻辑的,在这种情况下 Z 是双精度数。

  2. 并且不要手动将图像转换为双精度类型并使用 im2double 内部函数:I2 = im2double(I) 将强度图像 I 转换为双精度,必要时重新缩放数据。

  3. 您也可以使用 find 函数, [row,col,v] = find(X, ...) 返回 X 中非零条目的列或行向量 v 以及行和列索引。如果 X 是逻辑表达式,则 v 是逻辑数组。输出 v 包含通过计算表达式 X 获得的逻辑数组的非零元素。

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

于 2013-04-04T20:56:59.170 回答