私はすでにMATLABでいくつかの画像セグメンテーションを行っています。添付の写真はその結果です。私の質問は、画像から木の部分(下部)を自動的に削除するにはどうすればよいですか?言い換えれば、私は鳥を周囲から隔離する必要があります。私はそれらの画像を何百も持っているので、それを行うための方法を書く必要があります。ありがとう
2 に答える
この回答で十分だと思われる場合は、次のコードをダウンロードしてください: http://www.mathworks.com/matlabcentral/fileexchange/32532および次のコマンドを試してください。
I = rgb2gray(imread('BO1NO.jpg'));
th = 0.35 * max(max(I));
[P, J] = regionGrowing(I, [240,390], th, 300, 'true', 'true', 'false');
figure;imshow(J)
鳥と樹木の枝の強度差がはっきりとわかるので、何よりも地域成長アプローチのようなものを試す方がはるかに理にかなっています。私があなただったら、次に試すのは、カラー画像のセグメンテーション アルゴリズムです。RGB → グレーから変換するときよりも感覚をつかむので、いくつかの有用な情報が失われます。Bcoz の画像の灰色のバージョンでは、木の枝は鳥と同じ値を持っています (いくつかの地域で)。そのため、グレーに変換せずにカラー画像を直接操作することをお勧めします。パターン分類子を急いで使用しないでください。それはあなたの問題を解決するかもしれませんが、より簡単で安価な解決策が利用できる場合、それは賢明なことではありません. パターン認識/機械学習に介入することなく、厳密に画像処理の境界内でこの問題を解決する方法は複数あります。
このコードを試して、必要なものかどうかを確認してください。
I = imread('BO1NO.jpg');
% level = graythresh(I); BW = im2bw(I, level);figure;imshow(BW)
BW = im2bw(rgb2gray(I), 0.25);figure;imshow(BW);
% BW 画像で最大の連結要素 (鳥など) を削除すると、主に分岐が得られます。したがって、結果の画像を元の BW 画像から差し引きます。差分画像は鳥です。
BW1 = BW;
CC = bwconncomp(BW);
numPixels = cellfun(@numel,CC.PixelIdxList);
[biggest,idx] = max(numPixels);
BW(CC.PixelIdxList{idx}) = 0;
figure, imshow(BW);
figure, imshow(BW1);
Ir = imsubtract(BW1,BW);
figure;imshow(Ir)
しきい値の選択についても、otsu の方法を使用してしきい値処理を確認します。