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

ABC*_*013 4 matlab image-processing

我想计算每个块的图像雾度范围.这是通过找到用于反映雾度范围的暗通道值来完成的.这个概念来自Kaiming He关于使用Dark Channel Prior单图像雾霾去除的论文.

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

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

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

ray*_*ica 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);
Run Code Online (Sandbox Code Playgroud)

out_dark将包含您想要的暗通道图像.计算所需内容的关键在于最后两行代码. out包含红色,绿色和蓝色通道中每个空间位置的最小值,它们都在第三维中连接在一起以生成3D矩阵.之后,我应用min操作并查看第三个维度,最终选择每个像素位置的红色,绿色和蓝色通道中的哪个将给出输出值.

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

在此输入图像描述

在此输入图像描述


边注

如果您是图像处理纯粹主义者,则在灰度图像中找到像素邻域的最小值与找到灰度形态侵蚀相同.您可以将每个红色,绿色或蓝色通道视为其自己的灰度图像.因此,我们可以简单地更换ordfilt2imerode和使用矩形结构元素,产生要使用适用于你的图像像素附近.您可以strel在MATLAB中执行此操作并指定'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);
Run Code Online (Sandbox Code Playgroud)

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