2010-11-13 147 views
5

我被告知使用距離公式找到,如果顏色匹配,另一個讓我有,查找最近的RGB顏色

struct RGB_SPACE 
{ 
    float R, G, B; 
}; 

RGB_SPACE p = (255, 164, 32); //pre-defined 
RGB_SPACE u = (192, 35, 111); //user defined 

long distance = static_cast<long>(pow(u.R - p.R, 2) + pow(u.G - p.G, 2) + pow(u.B - p.B, 2)); 

此只給出一個距離,但我怎麼知道,如果顏色匹配用戶定義至少25%?

我不是很確定,但我有一個想法,檢查每個顏色值,看看差異是否是25%。例如。

float R = u.R/p.R * 100; 
float G = u.G/p.G * 100; 
float B = u.B/p.B * 100; 

if (R <= 25 && G <= 25 && B <= 25) 
{ 
    //color matches with pre-defined color. 
} 

回答

7

我會建議不要檢查RGB空間。如果你有(0,0,0)和(100,0,0),它們根據cababungas公式(以及根據認爲太多顏色相似的卡薩布蘭卡公式)是相似的。但是,他們看起來很不一樣。

HSL and HSV顏色模型基於人類對顏色的解釋,然後您可以輕鬆地指定相互獨立的色調,飽和度和亮度距離(取決於您的情況中「相似」的含義)。

+0

實際上是[lab](http://en.wikipedia。org/wiki/Lab_color_space)基於人類解釋的空間 – zenpoy 2012-03-05 15:18:21

2

注意,最大可能距離是(255,255,255)之間以及(0,0,0),這是在3 * 255^2的距離。很顯然,這兩種顏色最少匹配(0%匹配),它們的距離是100%。那麼至少25%的匹配意味着小於75%的距離,即3/4 * 3 * 255^2 = 9/4 * 255 * 255。所以你可以檢查是否:

distance <= 9/4 * 255 * 255 
+0

最大距離當然是sqrt(3 * 255^2)。我認爲,25%的比賽意味着差距不應超過整個範圍的1/4。所以最終的公式應該是:距離<= sqrt(3)/ 4 * 255. – cababunga 2010-11-13 07:56:16

+0

@cababunga:對於'sqrt',我忽略了,因爲OP沒有在他的等式中包含它。然而,「至少25%的匹配」仍然意味着任何小於75%的距離,因爲更多的距離意味着更少的匹配。 – casablanca 2010-11-13 16:07:20

4

「匹配至少25%」不是一個明確定義的問題。根據什麼度量匹配至少25%的內容?有很多可能的選擇。如果比較RGB顏色,那麼顯而易見的就是從矢量規範導出的距離度量。三個最重要的有:

  • 1範數或 「曼哈頓距離」:距離= ABS(R1-R2)+ ABS(G1-G2)+ ABS(B1-B2)
  • 2-範數或歐幾里德距離:距離= sqrt(pow(r1-r2,2)+ pow(g1-g2,2)+ pow(b1-b2,2))(你計算這個的平方,這很好 - 你可以避免如果你只是通過檢查閾值來檢查sqrt,則通過將閾值平方)
  • 無窮範數:距離=最大(abs(r1-r2),abs(g1-g2),abs(b1-b2))

當然,還有很多其他的可能性。您可以檢查它們是否在彼此的一定距離內:如果您希望在一個顏色通道中允許高達25%的差異(在可能的RGB值範圍內),則用於3種方法的閾值爲3/4 * 255,sqrt(3)/ 4 * 255和255/4。儘管這是一個非常粗糙的指標。

測量顏色之間距離的更好方法是將您的顏色轉換爲感知均勻的顏色空間,如CIELAB並在那裏進行比較;關於這個問題,還有一個相當不錯的Wikipedia article。這可能是矯枉過正,取決於您的預期應用,但那些色彩空間的測量距離與人類視覺系統感知的距離具有最佳相關性。

+0

+1。你回答自己的一個好問題! – augustin 2010-11-13 09:25:50

+0

我的意思是用戶定義的顏色至少與預定義的顏色相匹配25%。 – user963241 2010-11-13 10:08:34