2016-08-06 14 views
0

私は、特定の要因に基づいて白から濃い茶色に色が変わるペーパーストリップを含むプロジェクトに取り組んでいます。この色を分類できるアプリを書く必要があります。私はすでにOpenCVでその機能認識部分を書いていますが、私はさまざまな照明条件を扱うのに困っています。私は6つの異なる色を含む四角形を含んでいます:黒、白、および4つの異なる色合いのグレーがストリップに表示されます。しかし、私はまだインジケータの真の色を得ることに苦労しています。誰かが私を正しい方向に向けることができますか?ありがとう。OpenCVカラーコレクション

+1

こんにちは、あなたのコードとこれまでに試したことを含めて、スタックオーバーフローへようこそ。 – FishStix

+0

どこから始めたらいいか分からないので、まだ何もしていません。今、私はストリップの写真を撮り、いくつかの画像解析を行い、写真から抽出した6つの色を含むオブジェクトをbgr形式(チャンネルごとに1バイト)で返すメソッドを持っています。色は、サンプルカラー、黒、白、ライトグレー、グレー、ダークグレーです。私は真のbgrの値を知っているサンプルの色を除いてすべてのために。私は、サンプルカラーの真のbgr値を計算できる必要があります。 –

答えて

0

これは興味深い作業です。例えば、線形代数と最小二乗最小化を使って、簡単なアプローチから始めようとすることができます。

実際の色と登録色は、3Dベクトル(RGBやその他の色空間のカラー画像で作業することを前提としています)と、行列演算子(3x3)としての照明効果から考えることができます。

色の各ペアは、次の形式の制約を作成:

は、あなたが探しているオペレータ、が本当の色であり、そしてが観測された色です。

あなたは別の形でこれらの制約を書き直すことができる:​​はの構成要素である

(観察された色の表記は類似しています)。

この形式では、単に行列を積み重ねるだけで複数の観測値を組み合わせることができます。オペレータを正確に推定するには、少なくとも3つのカラーマッチが必要です。ノイズやその他の望ましくないエフェクトに強くしたい場合は、さらに多くのものが必要になります。

観測結果に基づいて行列を作成した後、演算子(実際の色から観測された色へのマッピング)を得るために、最小二乗法で一連の線形方程式を解くことができます。

演算子を見積もったら、実際に色を取得するために、観察する任意の色をと事前に乗算することができます。

これは理解しやすく効果的なアプローチですが、いくつかの欠点があります。

まず、実際の色と観測色との間に線形の関係があると仮定します。誤った仮定である可能性があります(私はそれを確認する実験を行っていません)。

さらに、カメラのダイナミックレンジが固定されているため、ライティングが線形演算子として機能しても、明るい照明のため色が範囲外になると問題が発生する可能性があります。非線形。

また、マーカーの色を慎重に選択する必要があります(範囲外に出る確率を減らすために、ダイナミックレンジの中間になければならないことに加えて、色空間を色分けして色を選択します) )。あなたの色の成分があまりにも相関している場合(例えば、灰色の陰影を使用する場合)、観測行列がランクを失って特異になり、Aの要素を不可能/無意味にすることができます。

シンプルなpythonスクリプトを使って、私が記述した演算子が単純な条件(均質な2倍の暗さ)で評価できるかどうかを確認しました。また、マーカーの色を変えて実験するのにも役立ちます。

import numpy as np 

# choose colors for marker 
Cr = np.array([[10, 200, 30], 
       [40, 50, 160], 
       [10, 80, 90], 
       [150, 60, 10]], dtype = np.float32) 

# simulate effect from light 
Co = (Cr/2) 

# form a set of constraints for a color pair 
def genConstr(pt): 
    constr = np.zeros((3, 9), dtype = np.float32) 
    constr[0, 0:3] = pt 
    constr[1, 3:6] = pt 
    constr[2, 6:9] = pt 
    return constr 

# form constraints for all colors on marker 
cs = np.zeros((0, 9), dtype = np.float32) 

for i in xrange(Cr.shape[0]): 
    cs = np.vstack((cs, genConstr(Cr[i, :]))) 

# estimate operator 
Ai = np.linalg.lstsq(cs, Co.flatten())[0].reshape((3, 3)) 
A = np.linalg.inv(Ai) 

#display results 
print 'operator:' 
print A 

print '' 

print 'reconstructed colors:' 
for i in xrange(Co.shape[0]): 
    print A.dot(Co[i]) 

それは次のような結果生成:あなたが見ることができるように

operator: 
[[ 2.00000000e+00 -3.12988124e-16 -3.83156015e-16] 
[ -1.77322970e-32 2.00000000e+00 -3.60822483e-16] 
[ 9.82882077e-17 -4.07302066e-16 2.00000000e+00]] 

reconstructed colors: 
[ 10. 200. 30.] 
[ 40. 50. 160.] 
[ 10. 80. 90.] 
[ 150. 60. 10.] 

を、推定オペレータは、理論上の(メインの対角線上2S)に非常に近く、実際の色を正確に再構築されます。

+0

詳細な書き込みをありがとうございます。私のサンプル写真のいくつかでこの方法を試した後、残念ながら、それは動作しません。私の観察から、実際の色と観測された色との関係は線形ではないように思われる - より明るい色の観察は、より暗い色の観察よりも真の色からより遠ざかるように見える。 –

+0

あなたのテストデータの一部を共有して、より関連性の高い回答を得ることができます:) – alexisrozhkov

+0

私の電話http://imgur.com/a/68Hf2で撮影した2枚のサンプル写真です。黒い箱の中の円の色は私が分類しようとしているものです。本当の色は:円の周りのボックスは黒ですので、RGB(0,0,0)、ボックスの下の大きな四角形の最も明るい色は白(255,255,255)、次に(200,201,205 )、(149,152,157)、(100,105,109)、最も暗い矩形は(52,60,63)である。私は白黒プリンタで印刷しなければならないので、これらの矩形をグレースケール以外のものにすることはできません。 –