加速matlab代码消除白色像素

时间:2012-08-07 09:12:07

标签: performance matlab

我有来自相机的rgb图像,其中包含白色像素。我编写了以下代码来消除它们。它可以工作,但需要永远。

% elliminate white pixel    
while 1
    maxValue = max(imageRGB(:));        
    [maxY maxX] = maxPosition(squeeze(imageRGB(:,:,c)));
    surr = 2;
    x_l = maxX - surr; if x_l < 1, x_l = 1; end
    x_r = maxX + surr; if x_r > size(imageRGB,2), x_r = size(imageRGB,2); end
    y_u = maxY - surr; if y_u < 1, y_u = 1; end
    y_b = maxY + surr; if y_b > size(imageRGB,1), y_b = size(imageRGB,1); end
    meanArea = ((y_b-y_u)+1) * ((x_r-x_l)+1) - 1;
    mean = (sum(sum(imageRGB(y_u:y_b, x_l:x_r,c))) - maxValue)/meanArea;        
    if (maxValue/mean > 1.5)
        imageRGB(maxY,maxX,c) = mean;
    else
        break;
    end
end

如何加速此代码的任何想法?

3 个答案:

答案 0 :(得分:2)

如果我错了,请纠正我,或者完全忽略这个'答案',但发布的代码似乎是:

  1. 找到图像中最白的像素(我在这里猜测,imageRGB不是内置的Matlab)。
  2. 找到最白像素的图像中的位置(另一个猜测,另一个未知函数maxPosition)。
  3. 进行某种平均,用最近的白色像素替换其邻近区域的平均值。
  4. 重复此过程,直到满足停止标准。
  5. 如果你有图像处理工具箱,你会发现它具有adjusting pixel intensity的各种功能,我认为你正在尝试做什么,所以你现在可以停止阅读这个答案了。如果您没有工具箱,请继续阅读。

    如果可以,您应该修改整个方法,并从图像的一次读取中确定平均阈值应该是多少。这会将maxValue的计算提升出循环,可以用thresholdValue的单个计算来代替它。然后你也可以将[maxY maxX]的计算提升出来。

    如果您不能这样做,仍然有一些选项可以提高您的操作速度。你可以:

    • 在开始操作之前,将图像全部用2像素填充。然后将您的操作应用于原始图像中的所有白色像素。显然,您必须将光晕像素设置为正确的值才能保持操作不变。

    • 仅对图像中不在边缘2像素范围内的像素进行操作。这将产生一个输出图像,每个维度的尺寸小4像素,但在大图像上,这通常不是问题。

    其中任何一个都消除了一大堆if语句和meanArea的重复计算(因为它变成常量)。

    如果你可以在处理开始时计算一次阈值,而不是迭代地重新计算它,你可能会发现你可以编写一个函数来实现平均值,你可以将其应用于图像中的所有像素,并消除需要找到白色像素。当然,该功能必须保持非白色像素不变。将操作应用于每个像素,确保对于不应更改的像素(或这些像素的标识操作)的空操作有时比首先找到需要更改的像素然后应用操作更快只对那些像素。

答案 1 :(得分:1)

  • 据我所知if表现不佳。

你可以替换

 x_l = maxX - surr; if x_l < 1, x_l = 1; end

 x_l = max(maxX - surr,1); 

和其他类似的。

此外,您可以将(maxValue/mean > 1.5)置于while循环的条件中。


  • 行中

    maxValue = max(imageRGB(:));
    [maxY maxX] = maxPosition(squeeze(imageRGB(:,:,c)));

你搜索最多两次。如果你这样写,我想你可以节省一些时间:

[maxY maxX] = maxPosition(squeeze(imageRGB(:,:,c)));
 maxValue = imageRGB(maxY,maxX,c);   

答案 2 :(得分:0)

另一种可能性是删除排序并计算整个图像的平均值。这可以通过conv2轻松完成,这是一个内置的,因此非常快与我们任何人都可以烹饪的东西相比。

假设您正在使用双灰度图像:

% generate an averageing filter
filterMat=ones(2*filterSize+1);
filterMat=filterMat/sum(filterMat(:));

% convolve with image
meanComplete=conv2(picture,filterMat,'same');

% calculate the decision criterion
changeIndices=picture./meanComplete>relThreshold & picture>absThreshold;

% use logical indexing to replace white pixels with the mean
newPicture=picture;
newPicture(changeIndices)=mean(changeIndices);

我需要50毫秒的一张全高清图像。