RGB空間與HSV空間的相互轉換(C++實現,修正網上大多數的代碼錯誤)

來源:互聯網
上載者:User

 

首先RGB空間與HSV空間都是映像的色彩空間。RGB色彩模式使用RGB模型為映像中每一個像素的RGB分量分配一個0~255範圍內的強度值。RGB映像只使用三種顏色,就可以使它們按照不同的比例混合,在螢幕上重現16777216種顏色。在 RGB 模式下,每種RGB 成分都可使用從 0(黑色)到 255(白色)的值。 例如,亮紅色使用 R 值 255、G 值 0 和 B 值 0。 當所有三種成分值相等時,產生灰色陰影。 當所有成分的值均為 255 時,結果是純白色;當該值為 0 時,結果是純黑色。HSV 模型通常用於電腦圖形應用中。在使用者必須選擇一個顏色應用於特定圖形元素各種應用環境中,經常使用 HSV 色輪。在其中,色相表示為圓環;可以使用一個獨立的三角形來表示飽和度和明度。典型的,這個三角形的垂直軸指示飽和度,而水平軸表示明度。在這種方式下,選擇顏色可以首先在圓環中選擇色相,在從三角形中選擇想要的飽和度和明度。

 

HSV 模型的另一種可視方法是圓錐體。在這種表示中,色相被表示為繞圓錐中心軸的角度,飽和度被表示為從圓錐的橫截面的圓心到這個點的距離,明度被表示為從圓錐的橫截面的圓心到頂點的距離。某些表示使用了六稜錐體。這種方法更適合在一個單一物體中展示這個 HSV 色彩空間;但是由於它的三維本質,它不適合在二維電腦介面中選擇顏色。
HSV 色彩空還可以表示為類似於上述圓錐體的圓柱體,色相沿著圓柱體的外圓周變化,飽和度沿著從橫截面的圓心的距離變化,明度沿著橫截面到底面和頂面的距離而變化。這種表示可能被認為是 HSV 色彩空間的更精確的數學模型;但是在實際中可區分出的飽和度和色相的層級數目隨著明度接近黑色而減少。此外電腦典型的用有限精度範圍來儲存 RGB 值;這約束了精度,再加上人類顏色感知的限制,使圓錐體表示在多數情況下更實用。
兩類空間的轉換
從 RGB 到 HSL 或 HSV 的轉換
設 (r, g, b) 分別是一個顏色的紅、綠和藍座標,它們的值是在 0 到 1 之間的實數。設 max 等價於 r, g 和 b 中的最大者。設 min 等於這些值中的最小者。要找到在 HSL 空間中的 (h, s, l) 值,這裡的 h ∈ [0, 360)是角度的色相角,而 s, l ∈ [0,1] 是飽和度和亮度,計算為:

 

void Rgb2Hsv(float R, float G, float B, float& H, float& S, float&V)<br />{<br /> // r,g,b values are from 0 to 1<br /> // h = [0,360], s = [0,1], v = [0,1]<br /> // if s == 0, then h = -1 (undefined)<br /> float min, max, delta,tmp;<br /> tmp = R>G?G:R;<br /> min = tmp>B?B:tmp;<br /> tmp = R>G?R:G;<br /> max = tmp>B?tmp:B;<br /> V = max; // v<br /> delta = max - min;<br /> if( max != 0 )<br />S = delta / max; // s<br /> else<br /> {<br /> // r = g = b = 0 // s = 0, v is undefined<br />S = 0;<br />H = 0;<br /> return;<br /> }<br />if (delta == 0){<br />H = 0;<br />return;<br />}<br />else if(R == max){<br />if (G >= B)<br /> H = (G - B) / delta; // between yellow & magenta<br />else<br />H = (G - B) / delta + 6.0;<br />}<br />else if( G == max )<br /> H = 2.0 + ( B - R ) / delta; // between cyan & yellow<br />else if (B == max)<br /> H = 4.0 + ( R - G ) / delta; // between magenta & cyan<br /> H *= 60.0; // degrees<br />}<br /> 

從 HSV 到 RGB 的轉換
類似的,給定在 HSV 中 (h, s, v) 值定義的一個顏色,帶有如上的 h,和分別表示飽和度和明度的 s 和 v 變化於 0 到 1 之間,在 RGB 空間中對應的 (r, g, b) 三原色可以計算為:

對於每個顏色向量 (r, g, b),

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.