2011-01-21 75 views
24

如何計算RGBA顏色空間中兩種顏色之間的相似度?(其中背景顏色是未知當然)RGBA顏色空間中的顏色相似性/距離

我需要尋找圖像中的每個像素的最好調色板項*重新映射的RGBA圖像的RGBA顏色的調色板。

在RGB顏色空間中的最相似的顏色可被假定爲是一個具有最小歐氏距離。然而,這種方法不RGBA工作,例如,歐氏距離rgba(0,0,0,0)rgba(0,0,0,50%)是不是rgba(100%,100%,100%,1%)較小,但後者看起來要好得多。

我使用的是預乘RGBA色彩空間:

r = r×a 
g = g×a 
b = b×a 

,我已經試過這個公式(編輯See the answer below for better formula):

Δr² + Δg² + Δb² + 3 × Δa² 

但它並不最佳 - 在具有半透明漸變的圖像中,它找到導致不連續/尖銳邊緣的錯誤顏色。不透明顏色和阿爾法之間的線性比例看起來很腥。

什麼是最佳公式?


*)爲了簡化這個問題我忽略了誤差擴散,gamma和心理視覺色彩空間。


輕微相關:如果你想找到這個非歐空間RGBA顏色最接近,vp-trees是最好的。

+1

超酷的問題!但是,我擔心背景顏色不是一個變量。我認爲你應該把它當作一個整體。 – anon 2011-01-21 02:01:48

+0

當然,我可以把它作爲一個變量,但那將是**未知的變量** :) RGBA的整點是允許任何背景。 – Kornel 2011-01-21 08:58:34

+0

您是否正在尋找一種公式,可以爲您提供所有可能的背景顏色的「距離」?或只是爲了一個未知的背景顏色? – 2011-01-21 11:41:23

回答

9

最後,我找到了它!徹底的測試和實驗後,我的結論是:

  • 正確的方法是計算兩個顏色之間最大可能差。
    任何種類的估計平均值/典型值差異的公式都有非線性的空間。

  • 我無法找到正確的公式,該公式可以計算出沒有將RGBA顏色與背景混合在一起的距離。

  • 沒有必要考慮每種可能的背景顏色。它可以簡化向下爲每個R/G/B信道的分別混合的最大和最小:

    1. 共混物中兩種顏色通道與通道 = 0作爲背景,測量平方差
    2. 共混物以通道 =最大爲背景,測量平方差
    3. 取兩者中較高者。

與 「白」, 「黑」 幸運勾兌當您使用預乘alpha(r = r×a)是微不足道的。

完整的公式爲:

max((r₁-r₂)², (r₁-r₂ - a₁+a₂)²) + 
max((g₁-g₂)², (g₁-g₂ - a₁+a₂)²) + 
max((b₁-b₂)², (b₁-b₂ - a₁+a₂)²) 

C Source including SSE2 implementation

0

我從來沒有做過,但理論和實踐說,圖像轉換RGB值和調色板luminance–chrominance將幫助您找到最好的比賽。我會離開Alpha通道,因爲透明度應該與「看起來更好」的部分毫無關係。

這XMASS我做了一些photomosaics使用相匹配的原始圖像的碎片圖像的集合開源軟件的禮物。這似乎是一個比你想要解決的問題更難的問題。其中一個項目是metapixel

最後,最好的選擇應該是使用現有的庫將圖像轉換爲一種格式,如PNG,您可以在其中控制面板。

1

我的想法是在所有可能的背景顏色一次整合和平均誤差平方。

即,對於每個組件計算(使用紅色信道作爲例子在這裏)

從0積分爲1((R1 * A1 + rB中*(1-A1)) - (R 2 * A2 + rB中*(1 -a2)))^ 2 * DRB

其中,如果我計算正確的計算結果爲:

dA=a1-a2 
dRA=r1*a1-r2*a2 
errorR=dRA^2+dA*dRA+dA^2/3 

再總結這些在R,G和B.

1

首先,一個非常有趣的問題:)
我沒有一個完整的解決方案(至少目前還沒有),但也有2明顯的極端情況下,我們應該考慮:
Δa==0問題類同到RGB空間
Δa==1問題是僅在α1-抗暗淡空間
所以式(這是非常類似於你陳述的一個),將滿足是:
(Δr² + Δg² + Δb²) × (1-(1-Δa)²) + Δa²(Δr² + Δg² + Δb²) × (1-Δa²) + Δa²

無論如何,它可能會像(Δr² + Δg² + Δb²) × f(Δa) + Δa²

如果我是你,我會嘗試模擬它與各種RGBA對和各種背景顏色,以找到最好的f(Δa)函數。不是很數學,但會給你足夠接近的答案

1

幾個原則:

  1. 當兩個顏色具有相同的α,rgbaDistance = rgbDistance *(阿爾法/ 255)。當兩個alpha都是255時,與RGB色距算法兼容。
  2. 所有具有非常低α值的顏色都是相似的。
  3. 具有相同RGB的兩種顏色之間的rgbaDistance線性依賴於增量Alpha。
double DistanceSquared(Color a, Color b) 
{ 
    int deltaR = a.R - b.R; 
    int deltaG = a.G - b.G; 
    int deltaB = a.B - b.B; 
    int deltaAlpha = a.A - B.A; 
    double rgbDistanceSquared = (deltaR * deltaR + deltaG * deltaG + deltaB * deltaB)/3; 
    return deltaAlpha * deltaAlpha/2.0 + rgbDistanceSquared * a.A * b.A/(255 * 255); 
}