デジタル画像処理⑤ HSV変換

タイトル: RGB カラー表現から HSV カラー表現に変換します。
国際標準のテスト画像 Lena を使用しています。
H(色相)色度:赤、青、緑など、通常呼ばれる色の名前です。色相と値は次の表に対応しています。

黄色 赤紫色
0°0\度 60 ° 60\度60° 120 ° 120\度120° 180° 180\度180° 240 ° 240\度240° 300 ° 300\度300° 360° 360\度360°

S (彩度) 彩度: 色の純度を表し、彩度が​​低いほど色が濃くなります。0 ≤ S ≤ 1 0\le S\le10S1 .
V(明度) 明るさ:色の明暗を表す 座標の原点の値を0、円錐の頂点の値を1 RGBでは3つの値で色が
ここに画像の説明を挿入
決まるたとえば、黄色は (255,255 ,0) です。HSV では、黄色は色相 = 60 という 1 つの値によってのみ決定されます。
HSV 表色系は RGB 表色系に変換でき、変換式は次のとおりです。

  1. RGB カラー システムから HSV カラー システムへ
    RGB を HSV カラー システムに変換する前に、R、G、B の 3 つのチャネルを 0-1 に正規化する必要があります。
    V = 最大 ( R 、 G 、 B ) V = 最大 (R、G、B)=最大x ( R ,G B )
    S = { [ V − min ( R , G , B ) ] / VV > 0 0 V = 0 S = \begin{cases} \lbrack V-min(R,G,B)\rbrack/V & V >0 \\ 0 &V=0 \end{ケース}S={ [ V( R ,G B )] / V0>0=0
    H = { 60 ( G − B ) / SVV = R 60 [ 2 + ( B − R ) / SV ] V = G 60 [ 4 + ( R − G ) / SV ] V = B 0 V = 0 H + 360 H < 0 H = \begin{cases} 60(GB)/SV & V=R \\ 60\lbrack 2+(BR)/SV\rbrack & V=G\\ 60\lbrack 4+(RG)/SV \rbrack & V=B\\ 0 & V=0 \\ H+360 &H<0 \end{cases}H= 60 (B ) / S V60 [ 2+( BR ) / S V ]60 [ 4+( RG ) / S V ]0H+360=R=G=B=0H<0
  2. HSV カラー システムを RGB カラー システムに変換する式は次のとおりです。
    0 < H ≤ 60 { R = VB = R − S ⋅ VG = S ⋅ V ⋅ H / 60 + B 0<H\le60 \begin{cases} R= V & \\ B=RS\cdot V \\ G=S\cdot V \\cdot H/60+B \end{cases}0<H60 R=B=RSG=SH /60+B
    300 < H ≤ 360 { R = VB = R − S ⋅ VG = G − S ⋅ V ⋅ ( H − 360 ) / 60 300<H\le360 \begin{cases} R=V & \\ B=RS\cdot V \\ G=GS \cdot V\cdot(H-360)/60 \end{cases}300<H360 R=B=RSG=GS( H360 ) / 60
    60 < H ≤ 120 { G = VB = G − S ⋅ VR = B − S ⋅ V ⋅ ( H − 120 ) / 60 60<H\le120 \begin{cases} G=V & \\ B=GS\cdot V \\ R=BS \cdot V\cdot(H-120)/60 \end{cases}60<H120 G=B=GSR=BS( H120 ) / 60
    120 < H ≤ 180 { G = VR = G − S ⋅ VB = R + S ⋅ V ⋅ ( H − 120 ) / 60 120<H\le180 \begin{cases} G=V & \\ R=GS\cdot V \\ B=R+S \cdot V\cdot(H-120)/60 \end{cases}120<H180 G=R=GSB=R+S( H120 ) / 60
    180 < H ≤ 240 { B = VR = B − S ⋅ VG = R − S ⋅ V ⋅ ( H − 240 ) / 60 180<H\le240 \begin{cases} B=V & \\ R=BS\cdot V \\ G=RS \cdot V\cdot(H-240)/60 \end{cases}180<H240 B=R=BSG=RS( H240 ) / 60
    240 < H ≤ 360 { B = VG = B − S ⋅ VR = G + S ⋅ V ⋅ ( H − 240 ) / 60 240<H\le360 \begin{cases} B=V & \\ G=BS\cdot V \\ R=G+S \cdot V\cdot(H-240)/60 \end{cases}240<H360 B=G=BSR=G+S( H240 ) / 60

RGB 色空間の 3 つの色のさまざまな組み合わせによって、他のほとんどすべての色を形成できます。色は 3 つの色成分の線形結合で表されます. どの色もこの 3 つの成分に関連しており、これらの 3 つの成分は高い相関関係にあるため、色を連続的に変更することは直感的ではありません.イメージ、変更する必要があります。これらの 3 つのコンポーネントで十分です。
ただし、これら 3 つの色成分に対する人間の目の感度は異なります。モノクロでは、人間の目は赤に対して最も感度が低く、青に対して最も感度が高くなります。したがって、RGB 色空間は均一性の低い色空間です。特定の色について、より正確な 3 成分の数値表現を推測することは困難です。したがって、RGB 色空間はディスプレイ システムには適していますが、画像処理には適していません。
C++ コードは次のとおりです。

cv::Mat RGB2HSV(cv::Mat img)
{
    
    
    cv::Mat hsv(img.size(), CV_32FC3);

    float r=0.0, g=0.0, b = 0.0;
    float _max = 0.0, _min = 0.0;
    float h = 0.0, s = 0.0, v = 0.0;

    for (int row = 0; row < img.rows; row++)
    {
    
    
        cv::Vec3b *currentData = img.ptr<cv::Vec3b>(row);
        for (int col = 0; col < img.cols; col++)
        {
    
    
            r = (*(currentData + col))[2] / 255;
            g = (*(currentData + col))[1] / 255;
            b = (*(currentData + col))[0] / 255;

            _max = max(r, max(g, b));
            _min = min(r, min(g, b));

            v = _max;

            if (v == 0)
            {
    
    
                s = 0;
            }
            else
            {
    
    
                s = (v - _min) / v;
            }

            if (v == r)
            {
    
    
                h = 60 * (g - b) / (s*v);
            }
            else if (v == g)
            {
    
    
                h = 60 * (2 + (b - r) / (s*v));
            }
            else if (v == b)
            {
    
    
                h = 60 * (4 + (r - g) / (s*v));
            }
            else if (v == 0)
            {
    
    
                h = 0;
            }
            else
            {
    
    
                h = h + 360;
            }
            
            hsv.at<cv::Vec3f>(row, col)[0] = h;
            hsv.at<cv::Vec3f>(row, col)[1] = s;
            hsv.at<cv::Vec3f>(row, col)[2] = v;
        }
    }
    return hsv;
}

参考ブログ:https://blog.csdn.net/jinking01/article/details/120224251
https://zh.wikipedia.org/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD% A9%E7%A9%BA%E9%97%B4

おすすめ

転載: blog.csdn.net/qq_41596730/article/details/126939430