2012-08-22 2101 views
5

鑑於在RGB我們可以表示256^3組的組合= 16,777,216種顏色,並且由於人眼只能區別大致10,000,000,有明顯的6777216個RGB組合即色是無法區分來自對應顏色的剩餘。RGB顏色相近的近似算法

壓縮算法逼近了當跨框架相信在顏色範圍空間差異在此基礎上工作。考慮到這一點,如何可靠地計算給定顏色是否在與另一個「相似性」的範圍內?

當然,「相似性」將是某種可以進行調整任意波形/可調參數,但是這是一個近似反正。那麼,任何指針,僞代碼,直觀的代碼示例,資源在那裏幫助我建模這樣的功能?

的幫助

+0

你說「6,777,216盈餘」,好像幾乎一半的信息被浪費了。情況並非如此。這6,777,216種顏色佔1-log2(1000000)/ 24',即。 3.11%的信息。不要指望壓縮! –

+0

多年後,這個問題似乎仍然相關。如果它幫助任何人,我發現了一個不同的使用HSL的解決方案,這是我最近寫的[這裏](https://medium.com/@dariushodaei/colour-coding-part-1-aa0d9910592) – ComethTheNerd

回答

5

感知色差可以使用的CIEDE2000 Color-Difference Formula計算。 CIEDE2000 formula基於LCH色彩空間(亮度,色度和色調)。 LCH色彩空間表示爲圓柱體(請參閱圖像here)。

準確度較低(但更易於管理)的模型是CIE76色差公式,該公式基於Lab color space (L*a*b*)。 RGB或CMYK值與L * a * b *之間沒有簡單的公式轉換公式,因爲RGB和CMYK顏色模型與設備有關。首先需要將RGB或CMYK值轉換爲特定的絕對色彩空間,例如sRGB或Adobe RGB。這種調整將取決於設備,但轉換後得到的數據將與設備無關,允許將數據轉換爲CIE 1931色彩空間,然後轉換爲L * a * b *。文章解釋了程序和公式。

+0

優秀的資源!帶回我對顏色感知所做的一個本底圖形模塊的記憶。謝謝你的指點 – ComethTheNerd

1

RGB色彩系統非常感謝這樣設計,如果2種顏色有接近彼此的值,則顏色也感知緊密。

示例:

由RGB =(100,100,100)中定義

顏色是感知上幾乎相同的顏色 RGB =(101,101,100),RGB =(98,100,99)等...

+0

因此,任何一列中的n <5都不會產生可感知的色差,那麼?這是一個開始測試的好地方,謝謝 – ComethTheNerd

+0

是的。試試這個在線工具進行測試:[Colors scheme](http://www.colorschemer.com/online.html) –

+0

請注意,您必須檢查value * component-wise *的緊密度,您不能只是去(color1 - color2)<閾值,因爲數據表示。這是顯而易見的,但可能是一個陷阱。 – Thomas

9

有計算顏色之間的距離的方法很多,最簡單的那些正在對任何顏色空間中的顏色分量來定義。這些是常見的 「距離」 或RGB顏色之間的度量(R1,G1,B1)和(R2,G2,B2):

  • 大號:ABS(R1-R2)+ ABS(G1-G2 )+ ABS(B1-B2)
  • 大號:SQRT((R1-R2)2 +(G1-G2)2 +(B1-B2)2)
  • 大號:最大(絕(r1-r2),abs(g1-g2),abs(b1-b2))

但是,這些並沒有考慮到人類視力低對顏色比對亮度敏感。爲了獲得最佳效果,您應該將RGB轉換爲分別編碼亮度和顏色的顏色空間。然後在新的色彩空間中使用上述指標之一,可能會給亮度分量增加更多權重,減少色彩分量。顏色的

區是不可區分的形式彼此被稱爲MacAdam ellipses。橢圓在CIELUVCIELAB色空間中變得接近圓形,這對計算很有用,但不幸的是,從RGB進入這些色空間並不那麼簡單。

JPEG將顏色轉換爲YCbCr,其中Y是亮度,兩個C的編碼顏色,然後將C分量的分辨率減半。你可以做同樣的,然後用上面的指標之一的稱重版本,例如:

diff = sqrt(1.4*sqr(y1-y2) + .8*sqr(cb1-cb2) + .8*sqr(cr1-cr2)) 

在維基百科上color difference文章有不同的色彩空間更多的例子。

+0

這真的很棒,謝謝你的建議。棘手的業務近似的顏色! – ComethTheNerd