用于从属RGB通道的Matlab模式滤波器

时间:2013-11-06 09:23:21

标签: image matlab filter

我一直在R,G和B通道上独立运行medfilt2,对RGB图像执行2D模式滤镜。但是,像这样分割RGB通道会在着色中产生伪影。有没有办法在保持RGB值“在一起”的同时执行2D中值滤波器?

或者,我可以更抽象地解释这个:想象一下我有一个2D矩阵,其中每个值包含一对索引坐标(即2X1向量的单元矩阵)。我将如何对此进行中值滤波?

以下是我如何进行独立模式过滤(给出工件):

r = colfilt(r0,[5 5],'sliding',@mode);
g = colfilt(g0,[5 5],'sliding',@mode);
b = colfilt(b0,[5 5],'sliding',@mode);

然而,colfilt不适用于细胞基质。

另一种方法可能是以某种方式将我的RGB通道组合成单个数字,从而创建标准的2D矩阵。不知道如何实现这一点,但是......

有什么想法吗?

感谢您的帮助。

干杯, 休

编辑: 好的,问题解决了。我就是这样做的。

我改编了我的问题,以便我不再处理(RGB)矢量,而是处理(UV)矢量。除了我的矢量是2D而不是3D之外,基本上仍然是同样的问题。

首先,我加载各个U和V通道,将它们各自排列成一维列表,然后将它们组合起来,所以我基本上有一个向量列表。然后我把它减少到那些独特的。然后,我为矩阵中的每个像素分配该唯一向量的索引值。在此之后,我可以进行模式过滤。然后我基本上反过来,因为我按像素方式遍历过滤后的图像,并读取每个像素的值(即列表中的索引),找到与该索引关联的唯一向量并将其插入该像素。 / p>

%   Create index list
img_u = img_iuv(:,:,2);
img_v = img_iuv(:,:,3);
coordlist = unique(cat(2,img_u(:),img_v(:)),'rows');
%   Create a 2D matrix of indices
img_idx = zeros(size(img_iuv,1),size(img_iuv,2),2);
for y = 1:length(Y)
    for x = 1:length(X)
        coords = squeeze(img_iuv(x,y,2:3))';
        [~,idx] = ismember(coords,coordlist,'rows');
        img_idx(x,y) = idx;       
    end
end
%   Apply the mode filter
img_idx = colfilt(img_idx,[n,n],'sliding',@mode);
%   Re-construct the original image using the filtered data
for y = 1:length(Y)
    for x = 1:length(X)
        idx = img_idx(x,y);
        try
            coords = coordlist(idx,:);
        end
        img_iuv(x,y,2:3) = coords(:);    
    end
end

不漂亮,但它完成了工作。我想这种方法也适用于RGB图像或其他类似情况。

干杯, 休

1 个答案:

答案 0 :(得分:0)

我不知道如何定义矢量变量的中位数。您可能需要将R,G,B组件减少为单个值,然后根据该值计算中位数。为什么不将强度等级用作单一值?您可以使用rgb2gray轻松完成。