为什么在传递到中值滤波器之前需要将图像转换为灰度?

时间:2017-03-09 13:23:02

标签: image matlab image-processing

为什么当我通过中值滤镜传递彩色图像时,我得到一个错误,说预期的输入应该是2D?

这是什么意思?

2 个答案:

答案 0 :(得分:4)

这是有道理的,因为RGB中描述了颜色的方式,即3D数组,而不是这些2D的灰度。

RGB不是线性刻度,当独立使用时,三个通道会相当多地改变色谱。这将在RGB中值滤波器中产生奇怪的颜色效果。

如果您考虑如何将中值滤波器应用于RGB,则有两种不同的可能性:

  1. 独立处理每个频道

  2. 将每个像素视为唯一的RGB值。

  3. 在第一种情况下,中值滤波器会产生奇怪的颜色。重复选择R,G和B值而不考虑其他值将产生与原件无关的随机颜色

    相反,如果您选择将像素值视为三元组,作为单个RGB数据,那么您将永远不会从中值滤波器中获取任何内容,因为2个像素值的可能性通过咬合在RGB咬合中具有完全相同的颜色非常低。因此,RGB三元组中的中值滤波器与99.99%的情况下无效。

    这就是为什么没有定义中值滤波器/在RGB中没有意义。

    然而 ...

    如果您将数据转换为HSVL a*b*,那么您可以对其每个组件进行中值滤波,并将结果转换回RGB。

答案 1 :(得分:1)

实际上,在RGB色彩空间中应用中值滤波器并不罕见。

如果目的是移除salt & pepper noise,它在RGB色彩空间中工作得很好 您需要单独传递每个颜色通道,而不是将RGB作为输入传递给medfilt2

Ander Biguri是对的:从数学的角度来看,在RGB色彩空间中应用中值滤波器是不正确的。这可能是为什么它不支持Matlab实现medfilt2的原因。

在RGB色彩空间中应用medfilt2的示例:

RGB = imread('https://i.stack.imgur.com/G2aNm.png');

figure;imshow(RGB);title('Original');

R = RGB(:, :, 1);
G = RGB(:, :, 2);
B = RGB(:, :, 3);

R = medfilt2(R);
G = medfilt2(G);
B = medfilt2(B);

RGB = cat(3, R, G, B);

figure;imshow(RGB);title('After median filter of each color channel');

原始图片:
enter image description here

每个颜色通道的中值滤波后的图像:
enter image description here

如您所见,它运作良好......