2017-08-03 6 views
1

人のカメラ画像を取得し、その人物を構成するピクセルを決定し、他のすべてのピクセルを(0,0,0)に設定するメソッドを作成しました。この新しい画像は、黒いピクセルで囲まれた人物を示しています。黒ピクセル(R、G、B)=(0,0,0)で囲まれた色付きピクセル(R、G、B)!=(0,0,0) ?

これらの画像は、最初の2つの次元が画像の幅と高さを構成し、3がチャネル(R、G、B)を表す形状(500,500,3)を有する。

私が次にしたいのはノイズを除去することです。その人物に属すると誤って分類されたピクセルがいくつかあります。つまり、黒画素で囲まれた画素である。

色はありますが、黒のピクセル(0,0,0)で囲まれたこれらの「孤独なピクセル」を削除するにはどうすればよいですか?

答えて

1

ジョーは私も畳み込みを使用しますが、異なるカーネルnp.ones((3,3))で示唆したよう:

1 1 1 
1 1 1 
1 1 1 

まず、あなたが何かを形500×500

のブール配列にあなたの配列を変換します次のようになります。bool_arr = np.sum(arr, axis = -1)!=0、黒のピクセルはFalse、その他はTrueとなります。

import scipy.signal 
conv_arr = scipy.signal.convolve2d(bool_arr, np.ones((3,3)), 'same') 
wrong_pixels = conv_arr == 1 # only one of the 9 pixels is colored 
pixels[wrong_pixels] = [0,0,0] # color all the wrong ones black 
+1

'bool_arr = np.sum(arr、axis = -1)== 0'では、すべての黒いピクセルが「真」になります。その機能を(もっと効率的に)したいのであれば、 'bool_arr = np.logical_not(np.logical_or.accumulate(arr、axis = -1))' –

+0

を試してください。本当にありがとうございます。私はバージョンを残しておきます。なぜなら、アレイが非常に小さいので、パフォーマンスがそれほど大きな問題であることを読んだり理解したりするのは簡単だと思うからです。 –

+0

ジョーのコンボリューションの利点は、 'wrong_pixels =〜conv_arr.astype(bool) 'を実行できるということです。なぜなら、' 0 '以外の整数は比較なしで' True 'に解決されるからです。はるかに高速。また、色付きのピクセルに隣接する多くの黒色のピクセルを上書きします。 –

1

for-loopのないソリューションが必要な場合は、3 x 3カーネルでコンボリューションを使用できます。

カーネルは

1 1 1 
1 0 1 
1 1 1 

のようになりますまたはあなたは、操作が「閉じる」動作するはず形態の画像処理を使用することができます。多分「侵食」でしょう。

Morphological Image Processing

関連する問題