2016-07-26 53 views
4

有沒有一種方法可以將由其十六進制代碼給出的顏色標識爲某種顏色的陰影?
我想我找到了一種方法,不知道如何準確的 - 但我怎麼能告訴我們,如果色彩搭配,我發現是不夠好找到最好的顏色匹配 - 如果沒有可用的顏色陰影,則拒絕

我需要能夠識別特定的顏色配色 - 一組固定的(紅,黃,橙,藍,綠,棕色,紫色,灰色,黑色,白色)。

目前我根據距離進行顏色搭配:

給定一個顏色c從上面(固定顏色列表中,我設置使用十六進制顏色有希望在範圍的中間爲彩色,我不太清楚如何獲得 - 現在我使用的顏色看起來「很好」),並且可用的顏色列表list,我嘗試從列表中找到具有最接近顏色的索引。

int matchColor(QColor c, QList<QColor> list) 
{ 
    int bestIndex = 0; 
    int distance; 
    int bestMatch = 0; 
    int sz = list.size() - 1; 

    for (int i = 0; i <= sz; ++i) 
    { 
     int Rdiff = 255 - qAbs(c.red() - list.at(i).red()); 
     int Gdiff = 255 - qAbs(c.green() - list.at(i).green()); 
     int Bdiff = 255 - qAbs(c.blue() - list.at(i).blue()); 
     distance = Rdiff + Gdiff + Bdiff; 

     if (distance > bestMatch) 
     { 
      bestMatch = distance; 
      bestIndex = i; 
     } 
    } 

    // if(bestMatch < 600 ? or something ?) return -1; 

    return bestIndex; 
} 

的問題是,因爲這場比賽是應該嚴格執行(對於某些標準),我必須返回特定顏色的陰影c失敗,如果我不能。
我不是100%肯定的顏色匹配是好的 - 雖然它似乎相當好。

但除了找到最佳的色彩搭配等 - 什麼是距離的合理值,這是我應該拒絕比賽? (期望0到765之間的distance,765完美匹配)。
我可以檢查某些範圍嗎?

對於每種顏色,範圍會不同?

注 - 我發現了一些類似的問題,有一些更復雜的算法,我不明白的引用 - 但我看到了什麼,能告訴我如何拒絕比賽......我希望如果任何一個更好的解決方案。

+1

是,該範圍將是對於每種顏色不同的,除非首先轉換爲一個感知上均勻的顏色空間,例如[CIE實驗室(https://en.wikipedia.org/wiki/Lab_color_space) 。 –

回答

6

它基本上是不可能告訴你哪些公差是可以接受的,以你的使用情況,但我強烈建議嘗試匹配顏色之前轉換爲HSV。 H分量很關鍵,應該可能有不超過20或30度的容差。 S和V遠不那麼重要;你可能會忽略它們,或者只能濾除色調完全消失的極端情況。

轉換這裏描述:Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both

+0

使用qt中的'QColor'方法,我可以得到HSL值 - 我試圖比較色調,如果是正面的。對於白色,黑色,灰色陰影,色調以-1表示,所以我比較這個值。看起來很簡單...但比較一些顏色,如棕色 - 「#8b4513」(色調= 25)找到最佳匹配橙色 - 「#e98300」(色調= 33)(差異= 8)(從隨機的顏色列表) - 它找到最接近的匹配(就像歐美的差異方法一樣),但是看起來色相沒有足夠的辨別力來拒絕那個匹配,而且8是一個很小的差異。 – Thalia

+0

好的,很抱歉聽到這個消息。我很多年前都在使用這種方法,當時我仍然需要支持8位(調色板)色彩輸出,並發現它能夠爲我的目的提供良好的效果。它似乎也是一個很好的匹配你的問題。 –

4

測量顏色差異被一種叫做德爾塔E.德爾塔E選自2個Lab值,其中實驗室是一種標準的方式的顏色描述計算的最標準方式。

DeltaE=sqrt(pow(L1-L2,2)+pow(a1-a2,2)+pow(b1-b2,2))

有三個Lab值中,L,a和b。 L是發光度量。 a和b決定色調和飽和度。把a和b想象成一個向量。長度是顏色飽和度,角度是色調。

選擇產生最小三角洲E.有一個叫DeltaE2000稍微好一點的版本,提高了小色差的匹配,但數學是更爲複雜和的DeltaE對於大多數來說已經足夠好顏色。

請參閱此處將sRGB值轉換爲Lab。

RGB to CIE LAB

+0

我會試着弄明白,我會回來:-) – Thalia