1

我一直在通过在 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 通道,将它们排列成一个 1D 列表,然后将它们组合起来,所以我基本上有一个向量列表。然后我把它简化为那些独一无二的。然后,我为矩阵中的每个像素分配该唯一向量的索引值。在此之后,我可以进行模式过滤。然后我基本上做相反的事情,因为我逐像素遍历过滤后的图像,并读取每个像素的值(即我的列表中的索引),并找到与该索引关联的唯一向量并将其插入该像素。

%   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 图像或其他类似情况。

干杯,休

4

1 回答 1

0

我看不出如何定义向量变量的中位数。您可能需要将 R、G、B 分量减少为单个值,然后计算该值的中位数。为什么不使用强度级别作为单个值?你可以很容易地做到这一点rgb2gray

于 2013-11-06T09:25:21.273 回答