0

我有来自包含白色像素的相机的 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

有什么想法可以加快此代码的速度吗?

4

3 回答 3

2

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

  1. 找到图像中最白的像素(我在这里猜,imageRGB不是 Matlab 内置的)。
  2. 找到图像中最白像素的位置(另一个猜测,另一个未知函数maxPosition)。
  3. 进行某种平均,以用其邻近区域的平均值替换最白的像素。
  4. 重复这个过程,直到满足停止条件。

如果您有图像处理工具箱,您会发现它具有调整像素强度的各种功能,我认为这是您正在尝试做的事情,因此您现在可以停止阅读此答案。如果您没有工具箱,请继续阅读。

如果可以,您应该修改整个方法,并从一次读取图像中决定平均阈值应该是多少。这将取消maxValue循环的计算,可能用thresholdValue. 然后你也可以取消[maxY maxX]循环之外的计算。

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

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

或者

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

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

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

于 2012-08-07T12:28:34.383 回答
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)));

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

[maxY maxX] = maxPosition(squeeze(imageRGB(:,:,c)));
 maxValue = imageRGB(maxY,maxX,c);   
于 2012-08-07T10:54:31.097 回答
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 毫秒。

于 2012-08-07T14:11:39.597 回答