我有来自相机的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
如何加速此代码的任何想法?
答案 0 :(得分:2)
如果我错了,请纠正我,或者完全忽略这个'答案',但发布的代码似乎是:
imageRGB
不是内置的Matlab)。maxPosition
)。如果你有图像处理工具箱,你会发现它具有adjusting pixel intensity的各种功能,我认为你正在尝试做什么,所以你现在可以停止阅读这个答案了。如果您没有工具箱,请继续阅读。
如果可以,您应该修改整个方法,并从图像的一次读取中确定平均阈值应该是多少。这会将maxValue
的计算提升出循环,可以用thresholdValue
的单个计算来代替它。然后你也可以将[maxY maxX]
的计算提升出来。
如果您不能这样做,仍然有一些选项可以提高您的操作速度。你可以:
或
其中任何一个都消除了一大堆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毫秒的一张全高清图像。