2017-03-17 6 views
1

カメラの画像を解析していて、黒い文字を取得したいと考えています。最初に、すべてのチャンネルのしきい値を定義し、それらを画像に適用しました。黒以外のピクセルをフィルタリングする第2の方法の実装

low = [0, 0, 0] 
up = [0.42, 0.42, 0.42] 

その後、私はちょうど

マスク= cv2.inRange(低、アップ画像、)私が見つけるまで

は今、これが働いたと私の画像を閾値により、ここからさらに使用するためのマスクを取得しさまざまな光条件が私に問題を引き起こしました。たとえば、画像が明るい場合は、上のしきい値を0.65に合わせることができます。このしきい値は、分析したすべてのケースで黒と白の区別に十分適しています。しかし、今は他の色が問題になっています。すべての可能な値を灰色がかった色に制限する第2の条件、すなわち各ピクセルについて3つのチャネルの値の間の特定の分散のみを許容する条件が機能すると考えた。

ここで問題は、[0.4, 0.6, 0.4]のピクセルが追い出され、[0.6, 0.62, 0.57]のピクセルがそのまま残るように、どのようにしてこの2番目の条件をスムーズに行うことができるかということです(ランダムな例では、 ?イメージ全体にタイムリーな反復を必要としないこれらの2つを組み合わせる最もスムーズな方法は何ですか?

おかげで、これは大いに役立ちます!

+0

達成したいことは完全にはわかりません。あなたは例を挙げてください(例えば、入力と期待される出力として3x3の "画像")。 –

+0

グレースケールの測定値がより単純なHSLまたはYUVカラースプレースに変換するとうまくいくかもしれません。 – Eric

+0

最後に、多かれ少なかれ灰色がかったピクセルがすべて真であるマスクを取得したいと思います。画像の黒い色は値[0.4、0.38、0.41]を持ち、色はチャンネルの1つでより高い偏差(例えば[0.4、0.58、0.41])を持つ可能性があるので、各ピクセルのチャネル間の特定の差よりも大きい。 私は上記のチャンネルをチェックアウトしますが、まだ具体的な解決方法を理解しています。今は少しはっきりしていますか? – mamamamama

答えて

1

チャネル間強度範囲は、あなたが完全にベクトル化ソリューションを開発するためにnumpyのbroadcastingを利用することができる軸2に沿って最大値と最小強度との差である:

import numpy as np 

def in_range(rgb, rgb_min, rgb_max): 
    masks = np.logical_and(rgb >= rgb_min, rgb <= rgb_max) 
    return np.all(masks, axis=2) 

def small_deviation(rgb, rgb_dev): 
    return (np.max(rgb, axis=2) - np.min(rgb, axis=2)) < rgb_dev 

DEMO

以下のサンプルでは、​​ランダムに生成された4行と5列の3チャネル画像を使用します。

In [80]: np.random.seed(0) 

In [81]: image = np.random.random(size=(4, 5, 3)) 

In [82]: np.set_printoptions(precision=2) 

In [83]: np.rollaxis(image, 2, 0) 
Out[83]: 
array([[[ 0.55, 0.54, 0.44, 0.38, 0.57], 
     [ 0.09, 0.78, 0.8 , 0.12, 0.94], 
     [ 0.26, 0.57, 0.61, 0.68, 0.7 ], 
     [ 0.67, 0.32, 0.44, 0.21, 0.25]], 

     [[ 0.72, 0.42, 0.89, 0.79, 0.93], 
     [ 0.02, 0.87, 0.46, 0.64, 0.52], 
     [ 0.77, 0.02, 0.62, 0.36, 0.06], 
     [ 0.21, 0.36, 0.99, 0.16, 0.47]], 

     [[ 0.6 , 0.65, 0.96, 0.53, 0.07], 
     [ 0.83, 0.98, 0.78, 0.14, 0.41], 
     [ 0.46, 0.62, 0.94, 0.44, 0.67], 
     [ 0.13, 0.57, 0.1 , 0.65, 0.24]]]) 

閾値はlow = [.0, .0, .0]up = [.6, .5, 0.7]dev = .4に設定しました。

In [84]: low = [.0, .0, .0] 

In [85]: up = [.6, .5, 0.7] 

In [86]: mask1 = in_range(image, low, up) 

In [87]: mask1 
Out[87]: 
array([[False, True, False, False, False], 
     [False, False, False, False, False], 
     [False, True, False, False, False], 
     [False, True, False, True, True]], dtype=bool) 

In [88]: dev = .4 

In [89]: mask2 = small_deviation(image, dev) 

In [90]: mask2 
Out[90]: 
array([[ True, True, False, False, False], 
     [False, True, True, False, False], 
     [False, False, True, True, False], 
     [False, True, False, False, True]], dtype=bool) 

In [91]: mask = np.logical_and(mask1, mask2) 

In [92]: mask 
Out[92]: 
array([[False, True, False, False, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False], 
     [False, True, False, False, True]], dtype=bool) 
+0

この回答をありがとう、ちょうど私が探していたもの!あなたも、2人の行方不明にアップアップすることができます;) – mamamamama

関連する問題