如何在MATLAB上找到图像的阴霾?

时间:2014-11-19 03:30:05

标签: matlab image-processing

我想计算每个块的图像雾度范围。这是通过找到用于反映雾度范围的暗通道值来完成的。这个概念来自Kaiming He关于Single Image Haze Removal using Dark Channel Prior的论文。

每个块的暗通道值定义如下:

其中I^c (x',y')表示颜色通道(x',y')(红色,绿色或蓝色通道之一)中像素位置c的强度,omega(x,y)表示像素位置(x',y')的邻域。

我不确定如何在MATLAB中翻译这个等式?

2 个答案:

答案 0 :(得分:9)

如果我正确理解了此等式所要求的内容,您实际上是在图像中提取以(x,y)为中心的像素块,您可以确定此像素块中红色,绿色和蓝色通道的最小值。这导致3个值,其中每个值是每个通道的像素块内的最小值。从这3个值中,您可以选择最小值,这是图像中位置(x,y)的最终结果。

我们可以使用ordfilt2轻松完成此操作。 ordfilt2的作用是将订单统计过滤器应用于您的图片。您可以指定需要在邻域中分析像素的遮罩,它会收集邻域中被视为有效的像素并对其强度进行排序。然后,您可以选择最终所需像素的等级。较低的等级表示较小的值,而较大的等级表示较大的值。在我们的示例中,掩码将设置为所有逻辑true,并且是要分析的邻域的大小。  因为你想要一个最小值,你会选择结果的等级1。

您可以将其应用于每个红色,绿色和蓝色通道,然后对于每个空间位置,选择三个中的最小值。因此,假设您的图片存储在im中,并且您希望将m x n邻域应用于图像,请执行以下操作:

%// Find minimum intensity for each location for each channel
out_red = ordfilt2(im(:,:,1), 1, true(m, n));
out_green = ordfilt2(im(:,:,2), 1, true(m, n));
out_blue = ordfilt2(im(:,:,3), 1, true(m, n));

%// Create a new colour image that has these all stacked
out = cat(3, out_red, out_green, out_blue);

%// Find dark channel image
out_dark = min(out, [], 3);

out_dark将包含您想要的暗通道图像。计算所需内容的关键在于最后两行代码。 out包含红色,绿色和蓝色通道中每个空间位置的最小值,它们都是concatenated in the third dimension to produce a 3D matrix。之后,我应用min操作并查看第三个维度,最终选择每个像素位置的红色,绿色和蓝色通道中的哪个将给出输出值。

举一个例子,如果我使用onion.png作为MATLAB系统路径的一部分,并指定一个5 x 5邻域(或m = 5, n = 5),这就是原始图像的样子,以及作为暗渠道结果:

enter image description here

enter image description here


旁注

如果您是图像处理纯粹主义者,则在灰度图像中查找像素邻域的最小值与查找灰度morphological erosion相同。您可以将每个红色,绿色或蓝色通道视为其自己的灰度图像。因此,我们可以简单地将ordfilt2替换为imerode,并使用矩形结构元素生成要用于应用于图像的像素邻域。您可以通过MATLAB中的strel执行此操作,并指定'rectangle'标志。

因此,使用形态学的等效代码将是:

%// Find minimum intensity for each location for each channel
se = strel('rectangle', [m n]);
out_red = imerode(im(:,:,1), se);
out_green = imerode(im(:,:,2), se);
out_blue = imerode(im(:,:,3), se);

%// Create a new colour image that has these all stacked
out = cat(3, out_red, out_green, out_blue);

%// Find dark channel image
out_dark = min(out, [], 3);

您应该获得与使用ordfilt2相同的结果。我没有做过任何测试,但我非常怀疑使用imerode比使用ordfilt2更快...至少在更高分辨率的图像上。 MATLAB具有高度优化的形态学例程,专门用于图像,而ordfilt2用于更一般的2D信号。

答案 1 :(得分:1)

或者您可以使用可见度指标来查看图像的模糊程度。事实证明有人为它写了一个beautiful code。指标越低,图像中的雾度越高。

此指标还可用作预处理器,以自动调整除雾参数。