我的工作,涉及到一個紙條,從白色改變顏色,基於某些因素深棕色一個項目,我需要編寫一個應用程序,能夠將此顏色分類。我已經在OpenCV中編寫了它的特徵識別部分,但是我遇到了不同照明條件的麻煩。我在這個過程中包含了一個包含6種不同顏色的矩形:黑色,白色和4種不同的灰色陰影。不過,我仍然在努力獲得指標的真實顏色。任何人都可以將我指向正確的方向嗎?謝謝。OpenCV的色彩校正
回答
這是一個有趣的任務。您可以嘗試從一些簡單的方法開始,例如使用線性代數和最小二乘法最小化。
我們可以考慮真實和登記顏色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),和真正的顏色被正確重建。
謝謝你的詳細寫作。在我的一些示例圖片上嘗試這種方法後,我可以說,不幸的是,它不起作用。根據我的觀察,似乎真實顏色和觀察顏色之間的關係不是線性的 - 更明亮的顏色觀察與真實顏色相比,顏色偏離更深。 –
您可以分享一些測試數據,然後獲得更多相關答案:) – alexisrozhkov
以下是我的手機http://imgur.com/a/68Hf2拍攝的兩張照片。黑盒子裏面的圓圈的顏色就是我想分類的東西。真實的顏色是:圓圈周圍的盒子是黑色的,所以RGB(0,0,0),盒子下面的大矩形上最亮的顏色是白色(255,255,255),然後是(200,201,205 ),(149,152,157),(100,105,109),最黑暗的矩形是(52,60,63)。它必須打印在黑白打印機上,因此我無法將這些矩形設置爲灰度以外的其他任何東西。 –
- 1. UIImage的色彩校正
- 2. Android上的色彩校正
- 3. OpenCV - 顏色校正
- 4. 色彩校正矩陣紋理
- 5. 使用OpenCV進行網絡攝像頭色彩校準
- 6. 色彩搭配OpenCV的
- 7. OpenCV:檢測彩色斑點
- 8. OpenCV彩色圖像灰色故障
- 9. 對16位圖像使用8位色彩校正矩陣
- 10. OpenCV上抖動校正的圖像校正
- 11. OpenCV和使用的色彩空間
- 12. OpenCV中HSV色彩空間的文檔
- 13. OpenCV在圖像上有太多黑色區域的校正C++
- 14. OpenCV彩色開源替代SIFT和SURF
- 15. Opencv色彩空間和頻道
- 16. 彩色濾光片技術OpenCV
- 17. 校準Opencv
- 18. Flash AS3顏色校正
- 19. OpenCV未校準相機校正用於三維重建
- 20. OpenCV校準代碼
- 21. OpenCV的OpenNI校準Kinect的
- 22. OpenCV-顏色跟蹤輸出作爲彩色背景
- 23. python和opencv的校準
- 24. 彩色
- 25. 彩色化正/負號(jQuery的)
- 26. GridView的彩色正方形 - Android
- 27. 與OpenCV中的色彩噪聲的圖像比較?
- 28. 彩色陰影彩色竊賊
- 29. Modifiying色彩與色彩平衡
- 30. 彩色jcombobox彩色項目和焦點
您好,歡迎使用Stack Overflow,請包括您的代碼以及迄今已嘗試過的內容。 – FishStix
那麼,我還沒有做任何事情,因爲我不知道從哪裏開始。現在我有一種方法可以拍攝一張照片,進行一些圖像分析並返回一個包含從照片中提取的6種顏色的對象,格式爲bgr(每個通道1個字節)。顏色是:樣本顏色,黑色,白色,淺灰色,灰色和深灰色。除了樣本顏色外,我知道所有這些都是真正的bgr值。我需要能夠計算樣本顏色的真實bgr值。 –