我想要计算每个区块的图像的模糊程度。这是通过查找暗通道值来实现的,该值用于反映雾霾的程度。这个概念来自凯明,他在基于暗通道先验的单幅图像消霾方法上的论文。
每个块的暗通道值定义如下:

其中I^c (x',y')表示彩色通道c (红色、绿色或蓝色通道之一)中像素位置的强度,omega(x,y)表示像素位置(x',y')的邻域。
我不知道如何在MATLAB中翻译这个方程?
发布于 2014-11-19 03:46:19
如果我正确地理解了这个方程要求的内容,您实际上是在提取图像中每个(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包含红色、绿色和蓝色通道中每个空间位置的最小值,它们都是在第三维空间中连在一起生成三维矩阵。然后,应用min操作,最后从每个像素位置的红、绿、蓝通道中选择哪一个输出值。
举个例子,如果我使用onion.png,这是MATLAB系统路径的一部分,并指定了一个5x5邻域(或m = 5, n = 5),这就是原始图像的样子,以及暗通道的结果:


侧纹
如果您是图像处理纯粹主义者,在灰度图像中找到像素邻域的最小值与查找灰度形态侵蚀相同。你可以考虑每个红,绿或蓝通道是它自己的灰度图像。因此,我们可以简单地将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信号。
发布于 2015-08-13 10:16:26
或者,您可以使用可见性度量来查看图像有多模糊。原来有人为它写了一个美丽代码,因为well.The的度量越低,图像中的模糊度就越高。
此度量还可用作自动调整dehaze参数的预处理器。
https://stackoverflow.com/questions/27008469
复制相似问题