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 チャンネルを何らかの方法で 1 つの数値に結合し、標準の 2D マトリックスを作成することもできます。ただし、これを実装する方法はわかりません...

何か案は?

ご協力いただきありがとうございます。

乾杯、ヒュー

編集:OK、問題は解決しました。これが私がやった方法です。

(RGB) ベクトルではなく (UV) ベクトルを扱うように、質問を調整しました。私のベクトルが3Dではなく2Dであることを除いて、本質的に同じ問題です。

まず、個々の 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 に答える