matlab - 如何在 MATLAB 上查找图像的雾度?

标签 matlab image-processing

我想为每个 block 计算图像的雾度范围。这是通过找到用于反射(reflect)雾度程度的暗 channel 值来完成的。这个概念来自 Kaiming He 的论文 Single Image Haze Removal using Dark Channel Prior .

每个 block 的暗 channel 值定义如下:

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

我不确定如何在 MATLAB 中转换这个等式?

最佳答案

如果我正确地理解了这个等式的要求,那么您实际上是在提取以图像中每个 (x,y) 为中心的像素 block ,然后确定该像素 block 内的最小值红色、绿色和蓝色 channel 。这会产生 3 个值,其中每个值都是每个 channel 的像素 block 内的最小值。从这 3 个值中,您选择其中的最小值,即图像中位置 (x,y) 的最终结果。

我们可以很容易地用 ordfilt2 做到这一点. ordfilt2 的作用是将订单统计过滤器应用于您的图像。您指定需要在您的邻域中分析哪些像素的掩码,它会收集邻域中被认为有效的那些像素并对其强度进行排序。然后你最后选择你想要的像素的等级。较低的等级意味着较小的值,而较高的等级表示较大的值。在我们的例子中,掩码将设置为所有逻辑 true 并且是您要分析的邻域的大小。 因为您想要最小值,所以您会选择结果的等级 1。

您可以将此应用到每个红色、绿色和蓝色 channel ,然后为每个空间位置选择三个中的最小值。因此,假设您的图像存储在 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 将包含您想要的暗 channel 图像。计算你想要什么的关键在最后两行代码。 out 包含红色、绿色和蓝色 channel 中每个空间位置的最小值,它们都是 concatenated in the third dimension to produce a 3D matrix .之后,我申请 min操作并查看三维,最终选择每个像素位置的红色、绿色和蓝色 channel 中的哪一个将给出输出值。

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

enter image description here

enter image description here


旁注

如果您是图像处理的纯粹主义者,在灰度图像中寻找像素邻域的最小值与寻找灰度图像 morphological erosion 是一样的。 .您可以将每个红色、绿色或蓝色 channel 视为其自己的灰度图像。因此,我们可以简单地将 ordfilt2 替换为 imerode并使用矩形结构元素生成要用于图像的像素邻域。您可以通过 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);

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

关于matlab - 如何在 MATLAB 上查找图像的雾度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27008469/

相关文章:

algorithm - 一张照片转矢量 'scribbled line'算法

python - 使用 Hough 变换、OpenCV 和 python 进行平行线检测

matlab - 是否可以防止 matlab 定义覆盖函数名称的变量?

matlab - 如何计算配准后图像中点的新坐标?

java - Matlab 可以生成 Java 源代码吗?

c++ - 在OpenCV C++中拼接2张图像后去除图像的黑色部分

matlab - Octave 中的文件名太长

matlab - 来自 Matlab 的 Weka : Attribute Selection

python - 立体标定Opencv Python和视差图

image-processing - 有关cvPerspectiveTransform的OpenCV帮助