为什么当我通过中值滤镜传递彩色图像时,我得到一个错误,说预期的输入应该是2D?
这是什么意思?答案 0 :(得分:4)
这是有道理的,因为RGB中描述了颜色的方式,即3D数组,而不是这些2D的灰度。
RGB不是线性刻度,当独立使用时,三个通道会相当多地改变色谱。这将在RGB中值滤波器中产生奇怪的颜色效果。
如果您考虑如何将中值滤波器应用于RGB,则有两种不同的可能性:
独立处理每个频道
将每个像素视为唯一的RGB值。
在第一种情况下,中值滤波器会产生奇怪的颜色。重复选择R,G和B值而不考虑其他值将产生与原件无关的随机颜色
相反,如果您选择将像素值视为三元组,作为单个RGB数据,那么您将永远不会从中值滤波器中获取任何内容,因为2个像素值的可能性通过咬合在RGB咬合中具有完全相同的颜色非常低。因此,RGB三元组中的中值滤波器与99.99%的情况下无效。
这就是为什么没有定义中值滤波器/在RGB中没有意义。
然而 ...
如果您将数据转换为HSV
或L 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');
如您所见,它运作良好......