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 画像やその他の同様の状況でも機能すると思います。
乾杯、ヒュー