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

Image 为什么图像在传递到中值滤波器之前需要转换为灰度?,image,matlab,image-processing,Image,Matlab,Image Processing,为什么当我将彩色图像通过中值滤波器时,我会得到一个错误,即预期输入应该是2D 这意味着什么?这是有意义的,因为颜色在RGB中的描述方式是3D数组,而灰度是2D数组 RGB不是线性比例,当单独使用时,三个通道会极大地改变颜色光谱。这将在RGB中值滤波器中造成奇怪的颜色效果 如果您考虑如何将中值滤波器应用于RGB,有两种不同的可能性: 独立处理每个通道 将每个像素视为唯一的RGB值 在第一种情况下,中值滤波器会给出奇怪的颜色。重复选择R、G和B值而不考虑其他值将生成与原稿无关的随机颜色 相反,如果您

为什么当我将彩色图像通过中值滤波器时,我会得到一个错误,即预期输入应该是2D


这意味着什么?

这是有意义的,因为颜色在RGB中的描述方式是3D数组,而灰度是2D数组

RGB不是线性比例,当单独使用时,三个通道会极大地改变颜色光谱。这将在RGB中值滤波器中造成奇怪的颜色效果

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

  • 独立处理每个通道

  • 将每个像素视为唯一的RGB值

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

    相反,如果您选择将像素值视为三元组,视为单个RGB数据,那么您将永远无法从中值滤波器中获得任何东西,因为在RGB逐点中,两个像素值具有完全相同颜色的可能性非常低。因此,在99.99%的情况下,RGB三元组中的中值滤波器等同于不做任何事情

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


    然而


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

    这是有意义的,因为RGB中描述的颜色是3D数组,而不是2D中的灰度

    RGB不是线性比例,当单独使用时,三个通道会极大地改变颜色光谱。这将在RGB中值滤波器中造成奇怪的颜色效果

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

  • 独立处理每个通道

  • 将每个像素视为唯一的RGB值

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

    相反,如果您选择将像素值视为三元组,视为单个RGB数据,那么您将永远无法从中值滤波器中获得任何东西,因为在RGB逐点中,两个像素值具有完全相同颜色的可能性非常低。因此,在99.99%的情况下,RGB三元组中的中值滤波器等同于不做任何事情

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


    然而


    如果将数据转换为HSV或L a*b*,则可以对其每个组件进行中值滤波,并将结果转换回RGB。

    实际上,在RGB颜色空间中应用中值滤波并不少见

    如果目的是删除,则它在RGB颜色空间中运行良好。
    您需要单独传递每个颜色通道,而不是将RGB作为输入传递到
    medfilt2

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

    在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');
    
    原始图像:

    每个颜色通道中值滤波后的图像:


    正如您所看到的,它工作得非常好…

    实际上,在RGB颜色空间中应用中值滤波器并不少见

    如果目的是删除,则它在RGB颜色空间中运行良好。
    您需要单独传递每个颜色通道,而不是将RGB作为输入传递到
    medfilt2

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

    在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');
    
    原始图像:

    每个颜色通道中值滤波后的图像:


    正如您所看到的,它工作得非常好…

    而在某些情况下,对于小内核窗口,这可能不会引入伪影,但对于任意图像来说,这是一种相对高风险的操作。转换为HSV并返回是一个计算成本非常低的操作,我认为最好保持数学严谨性,并在HSV中使用过滤器是安全的。也就是说,回答得很好。Lenna也必须+1:PNo担心。如果你想找到我,就来看看我吧!虽然在某些情况下,对于小内核窗口,这可能不会引入伪影,但对于任意图像,这是一种相对高风险的操作。转换为HSV并返回是一个计算成本非常低的操作,我认为最好保持数学严谨性,并在HSV中使用过滤器是安全的。也就是说,回答得很好。Lenna也必须+1:PNo担心。如果你想找到我,就来看看我吧!