一個相當好的解決方案是從RGB色彩空間切換到Y色彩空間之一,如YUV,YCrCb或其中任何一個。在所有情況下,Y通道代表亮度,其他兩個通道代表顏色,相對於亮度。您可能想要將亮度因子分解出來,可能需要注意將所有顏色都排除在某個黑暗之外,因此單獨獲取Y是本身有幫助的第一步。
通過簡單的線性組合實現從RGB到YUV的轉換。直接從維基百科和其他成千上萬來源:
y = 0.299*r + 0.587*g + 0.114*b;
u = -0.14713*r - 0.28886*g + 0.436*b;
v = 0.615*r - 0.51499*g - 0.10001*b;
假設你保持R,G和B在區間[0,1],您的第一個測試可能是:
if(y < 0.05)
{
// this colour is very dark, so it's considered to be as
// far as we allow from any colour we're interested in
}
要決定那麼你的顏色是多麼接近,比如說,綠色,制定出你感興趣的綠色的U和v分量,爲y的比例:
r = b = 0;
g = 0;
y = 0.299*r + 0.587*g + 0.114*b = 0.587;
u = -0.14713*r - 0.28886*g + 0.436*b = -0.28886;
v = 0.615*r - 0.51499*g - 0.10001*b = -0.51499;
proportionOfU = u/y = -2.0479;
proportionOfV = v/y = -0.8773;
隨後,制定和比較的比例U和V爲輸入的顏色和比較(例如與2d平面距離)到你計算的顏色比較。更接近的值更相似。您如何擴展和使用該指標取決於您的應用程序。
請注意,隨着y趨於0,由於輸入數據的範圍有限,計算的比例變得越來越不精確,並且當y爲0時未定義。從概念上講,這是因爲當沒有光時,所有顏色看起來完全相同在他們。檢查y是否高於某個最小值是解決此問題的實用方法。這也意味着,如果你試圖說「這張照片多麼黑」,你就不會得到明智的結果,儘管這也是因爲不反射任何光線的曲面和曲面之間的不確定性,沒有任何光線落在它上面。
太棒了 - 謝謝你...我會試試看。 – geekyaleks