2011-05-05 80 views
0

我正在使用C++編寫程序,程序是打開圖像並將光標移動到圖像上以讀取光標下的溫度。該圖像有14個不同的顏色補丁,我可以讀取顏色並將其轉換爲溫度。將RGB轉換爲HSL以獲得更高的分辨率C++

接下來我要做的就是生成一種能夠以更高分辨率顯示溫度的方法,即具有14個以上的色塊。然後在面板的GUI底部繪製新的色塊,以檢查是否可以在300K至30000K的範圍內在視覺上區分不同的溫度。

我不確定如何執行最後一部分。我認爲這與將RGB值轉換爲HSL有關,但我無法看到這將如何給我說28色塊。

任何幫助,將不勝感激。

感謝

+0

如果涉及HSL,它更多的是改善您可能使用的lerp的效果(完全不這樣做)。 – ssube 2011-05-05 23:31:13

回答

1

我不知道我的理解正是你想要做的事情,但它種聽起來像你正在尋找一個插值算法,基本放大圖像,在間隙與外部填充值原來的14種顏色。

有很多這樣的算法,但簡單的bicubic interpolation應該就足夠了。

2

從RGB轉換到HSV是一個奇特的步驟,您可以稍後再試。我想,要呈現什麼看起來像一個連續漸變色彩:

enter image description here

,對嗎?如果您需要渲染數百種顏色,但手頭只有14種顏色,則需要在相鄰顏色之間混合,這稱爲「插值」。

我們將嘗試一種「線性插值」,因爲它很簡單。稍後您可以嘗試「雙三次插值」。

假設您即將渲染上面漸變中的單色垂直線之一。首先,你需要確定它應該是什麼顏色。比方說,在垂直線的水平位置可以是99介於0和

然後,你需要找到你的14種顏色,其中兩個融入之間:

float x = horizontal_position * 13.f/99.f; 
int a = floorf(x); 
int b = std::min(13, a + 1); 

現在,你需要之間的融合這兩種顏色發現垂直線的顏色:在僞

float blend = x - a; 
color result = palette[a] * (1-blend) + palette[b] * blend; 

「色」以上即可RGB,YUV,HSV,等等。這部分是由你。請注意,HSV是「非線性色彩空間」,因此線性混合兩種HSV顏色可能會產生意想不到的結果。

+0

只是我還是做引號感覺有點「居高臨下」? =) – manneorama 2011-05-06 07:59:27

+1

當你寫作混合觀衆時,這是一個艱難的過程。沒有引號,並且行話將會像讀書人那樣讀給那些還不明白的人。太多的引號,你聽起來像博士邪惡的人已經瞭解的人:http://www.youtube.com/watch?v=tqos3j07jzc – bmcnett 2011-05-06 22:35:25