2016-08-06 272 views
0

我的工作,涉及到一個紙條,從白色改變顏色,基於某些因素深棕色一個項目,我需要編寫一個應用程序,能夠將此顏色分類。我已經在OpenCV中編寫了它的特徵識別部分,但是我遇到了不同照明條件的麻煩。我在這個過程中包含了一個包含6種不同顏色的矩形:黑色,白色和4種不同的灰色陰影。不過,我仍然在努力獲得指標的真實顏色。任何人都可以將我指向正確的方向嗎?謝謝。OpenCV的色彩校正

+1

您好,歡迎使用Stack Overflow,請包括您的代碼以及迄今已嘗試過的內容。 – FishStix

+0

那麼,我還沒有做任何事情,因爲我不知道從哪裏開始。現在我有一種方法可以拍攝一張照片,進行一些圖像分析並返回一個包含從照片中提取的6種顏色的對象,格式爲bgr(每個通道1個字節)。顏色是:樣本顏色,黑色,白色,淺灰色,灰色和深灰色。除了樣本顏色外,我知道所有這些都是真正的bgr值。我需要能夠計算樣本顏色的真實bgr值。 –

回答

0

這是一個有趣的任務。您可以嘗試從一些簡單的方法開始,例如使用線性代數和最小二乘法最小化。

我們可以考慮真實和登記顏色3D矢量(我假設你在RGB或其他顏色空間的彩色圖像的工作),並從效果照明作爲一個矩陣運算符(3×3)。

每對顏色產生了以下形式的約束:

,其中是你正在尋找運營商,是真實的顏色,觀察顏色。

可以在另一種形式中重寫這些約束:

​​哪裏是(符號爲觀察到的顏色是類似的)的組件。

這種形式允許我們通過簡單疊加矩陣來組合多個觀測值。您至少需要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拍攝的兩張照片。黑盒子裏面的圓圈的顏色就是我想分類的東西。真實的顏色是:圓圈周圍的盒子是黑色的,所以RGB(0,0,0),盒子下面的大矩形上最亮的顏色是白色(255,255,255),然後是(200,201,205 ),(149,152,157),(100,105,109),最黑暗的矩形是(52,60,63)。它必須打印在黑白打印機上,因此我無法將這些矩形設置爲灰度以外的其他任何東西。 –