2010-10-05 111 views
1

我有一個像素數組與我想要轉換爲RGB圖像相關聯的強度(作爲0和1之間的浮點數)。如何在C++中創建僞彩色圖像?

最簡單的方法是將每個值乘以255,並將其賦值給R + G + B以獲得灰度圖像,但我認爲使用整個顏色範圍來顯示更細微的差異會更好。

據我所知,這被稱爲僞/彩色圖像,但我很難找到它的算法。現在,我使用此代碼,但我想知道是否有一個更聰明的/更快的方式做到這一點:

if(intensity <= 0.25) { 
    p->r = 0; 
    p->g = 0; 
    p->b = (intensity) * 4 * 255; 
    return; 
} 

if(intensity <= 0.5) { 
    p->r = 0; 
    p->g = (intensity - 0.25) * 4 * 255; 
    p->b = 255; 
    return; 
} 

if(intensity <= 0.75) { 
    p->r = 0; 
    p->g = 255; 
    p->b = (0.75 - intensity) * 4 * 255; 
    return; 
} 

if(intensity <= 1.0) { 
    p->r = (intensity - 0.75) * 4 * 255; 
    p->g = (1.0 - intensity) * 4 * 255; 
    p->b = 0; 
    return; 
} 

此外,是否有任何標準的調色板,我應該爲這個使用?

+0

那麼那些應該可能是別的如果是,一件事...... – FrustratedWithFormsDesigner 2010-10-05 13:23:07

+1

我在ifs中使用return,所以應該使它們變得沒有必要。 – Nils 2010-10-05 13:39:35

+0

噢,沒關係。沒有真正習慣於這種編碼stlye。 – FrustratedWithFormsDesigner 2010-10-05 13:53:10

回答

3

您可以改爲使用HSV或HSL

嘗試使用0到1的值設置色調,並使用飽和度和值的常量。您會發現很多示例代碼可將您的HSV值轉換爲RGB值。

http://en.wikipedia.org/wiki/HSL_and_HSV

當你看到一個「人工色素」的形象,這往往是使用什麼。好處是圖像的所有區域都很亮,圖像的「黑暗」部分只是呈現出不同的顏色。

如果您使用HSL,您還可以在0-1範圍內的大部分範圍內將亮度設置爲50%,但允許它在接近結束時(例如從0.9到1)上升,這將有助於將白色的圖像強烈的部分。

另一種選擇是使用False Color Palette。在這裏,您只需創建一個8位圖像,併爲其創建適合您需要的調色板。有一些很好的例子here...

+0

我想這會工作,如果OP的「強度」被用於三個值中的任何一個,只要其他兩個保持不變。 – FrustratedWithFormsDesigner 2010-10-05 13:37:06

+0

是的,但是將它固定在色調上會創造一個五光十色的圖像,各個層次的亮度都很清晰。您也只能將色相範圍的一部分映射到0-1範圍,因此您可以創建一個圖像,通過紅色從冷藍色變爲熱黃色。 – 2010-10-05 13:40:55

+0

我嘗試過創建一個HSL/HSV,這似乎工作得很好,謝謝!一個錯誤的調色板會更好,但是我在實現時遇到了一些麻煩 - 實際上是否有一些聰明的方法可以做到這一點(作爲我的強度的函數)還是實際上必須對所有顏色進行硬編碼? – Nils 2010-10-06 19:29:13

0

定義一串RGB值和它們將對應的強度。圖像中的每個亮度都位於這兩個點之間 - 您可以乘以一個常量並截斷,然後在數組中查找它們。一旦你有兩個RGB值,根據圖像強度和兩個端點的強度之間的距離進行插值。