オリジナルの庭のブログからの転載 ブレイブ-セーラー https://www.cnblogs.com/Free-Thinker/p/4952741.html
現在、コンピュータビジョンの分野では、色空間(カラースペース)には多くの種類があります。HSVとHSL色モデルは、2つの最も一般的な表現を円筒座標、それはRGBモデルを再マッピングされ、それは視覚的に、より視覚的に直感的なRGBモデルよりもすることが可能です。
HSV色空間
HSV(色相、彩度、値)円錐円筒座標系のサブセットに対応する色空間モデルは、円錐の頂面がV = 1に対応これはR = 1、G RGBモデルで含ま= 1、B = 1の色より明るく表される三辺、。H色所与のV軸周りの回転角。角度0〜赤色相当°、120の角度に対応する緑色°、青色240°に相当する角度。HSVカラーモデル、各色及びその補色に180°。0から1まで彩度S値は、コーン1の頂面の半径。カラードメインHSVカラーモデルは、CIE色度図に、100パーセントのモデル彩度、一般未満100%の純度のサブセットによって表されます。、V = 0でコーン(すなわち、原点)の頂点に、HおよびSは、黒色定義されていません。コーンS = 0、V = 1の上面の中央には、 Hは白を表す、未定義。原点から代表輝度のグレー暗く、即ち灰色の異なる階調を有します。これらの点については、S = 0は、Hの値が定義されていません。Vは、HSVのモデルに対応するが、主対角線のRGB色空間である軸言えます。円錐の頂点、V = 1、S = 1の周面上の色は 、 色が単色です。HSVカラーモデルは、画家の方法に相当します。白色濃縮物を変更するためにソリッドカラーのほかに、ソリッドカラー異なる色調の特定の方法から色深度とカラーコンセントレートを変更した画家は、得られる白と黒の異なる割合を添加しながら、ブラック色深度を変更するために添加されます色合いの様々な。
HSI色空間
HSI色空間は、色を記述するために、人間の視覚システム、色合い(色相)、彩度(飽和、又は彩度による)及び輝度(または輝度強度)からのものです。HSI色空間は円錐形のモデル空間で記述することができます。このモデルは、むしろHIS色空間複雑コーンによって記述されているが、彼らは色相ができ、明るさ、色の変化の状況は明らかに飽和状態に示されています。通常タイプと色深度の程度を示すために、色の色相と彩度として知られています。輝度に対する人間の視覚感度は、色合いの感度よりもはるかに強い色処理および識別を容易にするために、人間の視覚系は、しばしば、HSI色空間を使用しているので、それはRGB色空間よりも人間の視覚特性とより一致しています。画像処理とコンピュータビジョンアルゴリズムは便利HSI色空間で多くを使用することができ、彼らは別々に処理し、相互に独立していることができます。従って、HSI色空間において大幅ワークロード分析および画像処理を簡略化することができます。HSI色空間やRGB色空間と同じ量だけ異なる表現、従ってそれらの間の変換関係が存在します。
HSI色モデルは、H、色を記述するために、色相(色合い)、彩度Sを表す(彩度)及び代表輝度I(強度)を表すと、人間の視覚システムからのものです。彩度とちょうど逆の白色光の量は、それが鮮やかな色か否指標と言えます。私たちは、ディスプレイ上の画像を処理するために、HISのモデルを使用するのであれば、より現実的な効果を得ることができるようになります。
色相(色相):オブジェクトまたは伝導によって反射された波長を指します。より一般的には、赤、オレンジまたは同定する緑色などの色であり、尺度に0〜360度の値を取ります。
飽和(彩度):また、彩度として知られ、それは強度や色純度を指します。彩度とグレー表示の色相、及び0%(グレー)から100%(完全飽和)を測定しました。
輝度(強度):色の相対輝度を意味し、0%から100%(黒)から一般にパーセンテージ(白色)を測定しました。
代表HSL色相(色相)、飽和(彩度)及び明るさ(明度)、また、一般HLSと呼びます。色相、彩度、および値(バリュー)のHSVを表します。コール飽和が、二つの定義との間の差の背面から見ることができ、2つのH HSV色空間意味は同じであるが、飽和度の異なる定義です。
HSVとHSL色の両方が、「色相」に軸角度対応について、その中央に、黒、白、灰色の上部に底の値から、シリンダの中心軸をシリンダ内に説明する点をみなしますこの距離は、「彩度」、「明るさ」の軸に沿って対応する距離、「色相」またはに相当する軸「明度」。HSVは、人類により身近な方法は、色に関する情報をカプセル化:「何???の方法明暗色合いで何色。」HSL色空間、それよりもさらに良いいくつかの方法で、HSVに似ています。モデルHSLダブルコーン形状。
双方は、同様の目的で発現したが、この方法に違いがあります。数学的に、両方の円筒形であるが、HSV(色相、彩度、明度)は、概念的に概念的に逆円錐色(黒丸次の頂点、底に白い丸)、HSLが示すと考えることができます円錐と球の一対(半分白、グレー、黒の下の頂点の頂点、最大断面の中心にあります)。エルベ?レイ?スミスによって設立され1978年にHSVモデル。次の図は、HSVとHSLの円筒モデルを示します。
図円錐モデル:
コーンに、色相Hの角度を表す、彩度Sは、中心点から垂直線で表され、または輝度値Vは、中央垂直線で表されます。黄、緑、シアン、青、オレンジ、続いて0度の角度赤、。60度の連続的な2つの色差角。
次の図は、HS面にRGBのマッピングの例を示しています。
以下の表は、HSVとHSLにRGBのサンプルのマッピングを示します。
それは、RGBからHSV色空間への変換どのように?以下の手順を使用して達成し、HSV、HSLのRGBからの変換することができます。
点Rが知られている、G、B、最大値と最小値
計算されたH:
Lを計算し、そしてVされています。
計算されたS:
上面的公式实现了从RGB到HSL和HSV的转换。那么当采用Opencv的彩色空间转化函数cvCvtColor(orgFrame,destFrame, CV_BGR2HSV),如果图像的数据类型为8位字符型时,则H、S、V都量化到整数{0~255},可以看出H的精度不是很高。
当在HSL和HSV空间进行处理后,需要转换到RGB,可以采用下面的公式计算RGB。
先讨论HSV到RGB的转换,这里H ∈ [0°, 360°], S ∈ [0, 1], V ∈ [0, 1]。转换公式如下:
计算C
最后得到:
从HSL到RGB的转换。这里H ∈ [0°, 360°], S ∈ [0, 1], V ∈ [0, 1]。转换公式如下:
然后:
最后得到:
展示的 RGB 值的范围是 0.0 到 1.0。
下面用C实现RGB到HSV的转换,采用宏定义的方式。
1 // ///////////////////////////////////////////////////////////////////// 2 // 3 // cvlab.net 4 // C/C++ Macro RGB to HSV 5 #define PIX_RGB_TO_HSV_COMMON(R,G,B,H,S,V,NORM) \ 6 if((B > G) && (B > R)) \ 7 { \ 8 V = B; \ 9 if(V != 0) \ 10 { \ 11 double min; \ 12 if(R > G) min = G; \ 13 else min = R; \ 14 const double delta = V - min; \ 15 if(delta != 0) \ 16 { S = (delta/V); H = 4 + (R - G) / delta; } \ 17 else \ 18 { S = 0; H = 4 + (R - G); } \ 19 H *= 60; if(H < 0) H += 360; \ 20 if(!NORM) V = (V/255); \ 21 else S *= (100); \ 22 } \ 23 else \ 24 { S = 0; H = 0;} \ 25 } \ 26 else if(G > R) \ 27 { \ 28 V = G; \ 29 if(V != 0) \ 30 { \ 31 double min; \ 32 if(R > B) min = B; \ 33 else min = R; \ 34 const double delta = V - min; \ 35 if(delta != 0) \ 36 { S = (delta/V); H = 2 + (B - R) / delta; } \ 37 else \ 38 { S = 0; H = 2 + (B - R); } \ 39 H *= 60; if(H < 0) H += 360; \ 40 if(!NORM) V = (V/255); \ 41 else S *= (100); \ 42 } \ 43 else \ 44 { S = 0; H = 0;} \ 45 } \ 46 else \ 47 { \ 48 V = R; \ 49 if(V != 0) \ 50 { \ 51 double min; \ 52 if(G > B) min = B; \ 53 else min = G; \ 54 const double delta = V - min; \ 55 if(delta != 0) \ 56 { S = (delta/V); H = (G - B) / delta; } \ 57 else \ 58 { S = 0; H = (G - B); } \ 59 H *= 60; if(H < 0) H += 360; \ 60 if(!NORM) V = (V/255); \ 61 else S *= (100); \ 62 } \ 63 else \ 64 { S = 0; H = 0;} \ 65 } 66 67 // ////////////////////////////////////////////////////////////////// 68 // 69 // cvlab.net 70 // C/C++ Macro HSV to RGB 71 #define PIX_HSV_TO_RGB_COMMON(H,S,V,R,G,B) \ 72 if( V == 0 ) \ 73 { R = 0; G = 0; B = 0; } \ 74 else if( S == 0 ) \ 75 { \ 76 R = V; \ 77 G = V; \ 78 B = V; \ 79 } \ 80 else \ 81 { \ 82 const double hf = H / 60.0; \ 83 const int i = (int) floor( hf ); \ 84 const double f = hf - i; \ 85 const double pv = V * ( 1 - S ); \ 86 const double qv = V * ( 1 - S * f ); \ 87 const double tv = V * ( 1 - S * ( 1 - f ) ); \ 88 switch( i ) \ 89 { \ 90 case 0: \ 91 R = V; \ 92 G = tv; \ 93 B = pv; \ 94 break; \ 95 case 1: \ 96 R = qv; \ 97 G = V; \ 98 B = pv; \ 99 break; \ 100 case 2: \ 101 R = pv; \ 102 G = V; \ 103 B = tv; \ 104 break; \ 105 case 3: \ 106 R = pv; \ 107 G = qv; \ 108 B = V; \ 109 break; \ 110 case 4: \ 111 R = tv; \ 112 G = pv; \ 113 B = V; \ 114 break; \ 115 case 5: \ 116 R = V; \ 117 G = pv; \ 118 B = qv; \ 119 break; \ 120 case 6: \ 121 R = V; \ 122 G = tv; \ 123 B = pv; \ 124 break; \ 125 case -1: \ 126 R = V; \ 127 G = pv; \ 128 B = qv; \ 129 break; \ 130 default: \ 131 LFATAL("i Value error in Pixel conversion, Value is %d",i); \ 132 break; \ 133 } \ 134 } \ 135 R *= 255.0F; \ 136 G *= 255.0F; \ 137 B *= 255.0F; 138 139 140 ==============================================================================================================
在图像和视频处理中,经常需要在颜色空间YUV和RGB间转换。下面介绍如何在这两种格式间进行转换。
YUV可以实现较高的数据压缩率,这主要是由于U、V分量可以实现高度压缩。而RGB888采用8bits分别表示R、G、B三个分量。黑色:R = G = B = 0;白色:R = G = B = 255。
RGB888的采样格式为4:4:4。
转换RGB888为YUV
转换公式为:
1 Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16 2 U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128 3 V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128
上述公式的结果为8bit,但中间结果需要16bits的精度。
转换YUV到RGB888
转换公式为:
1 C = Y - 16 2 D = U - 128 3 E = V - 128
利用上述结果,然后计算RGB,
1 R = clip(( 298 * C + 409 * E + 128) >> 8) 2 G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8) 3 B = clip(( 298 * C + 516 * D + 128) >> 8)
这里clip() 表示限制RGB的值的范围在(0~255)。这些转换结果精度仍然为8bit,但是中间结果需要16bits精度。
注意当结果超出范围时,需要进行饱和截止。
如何要转换4:2:0 或者 4:2:2 YUV,需要首先转换YUV为4:4:4格式的YUV,然后再转换4:4:4 YUV为RGB888。