Opencv-C++ 注 (8): opencv-color モデルと変換

1.RGBカラーモデル

RGBカラーモデルは先ほど紹介しましたが、モデル名は赤(Red)、緑(Green)、青(Blue)の3色の英語の頭文字を組み合わせたものです。カラー モデルは最初に赤で名前が付けられていますが、OpenCV では逆の順序で、最初のチャネルが青 (B) コンポーネント、2 番目のチャネルが緑 (G) コンポーネント、3 番目のチャネルが赤 (R) です。 ) 成分。

OpenCV4 は、格納順序に応じて、最初のチャネルが赤色コンポーネントである画像を格納するために、この順序の逆順序の形式を提供しますが、図 3 に示すように、これら 2 つの形式の画像の色空間は同じです。3 つのチャネルは色の記述範囲が同じであるため、RGB カラー モデルの空間構成は立方体になります。

RGB カラーモデルでは、これら 3 つの色を異なる割合で混合することですべての色が得られ、3 つの色成分がすべて 0 の場合は黒、3 つの色成分が同じで最大値の場合は と表されます。白いように。各チャネルは、0 から 1 までの特定の色のプロセスを表します。異なるビットを持つ画像は、この色の変化を異なるレベルに細分化するプロセスを表します。たとえば、8U3C 形式の画像の各チャネルは、このプロセスを 256 レベルに量子化します。それぞれ 0 ~ 255 で指定します。このモデルに基づいて 4 番目のチャネルを追加したのが RGBA モデルです。4 番目のチャネルは色の透明度を表します。透明度の要件がない場合、RGBA モデルは RGB モデルに縮退します。

ここに画像の説明を挿入

2、YUVカラーモデル

YUV モデルは、テレビ信号システムで使用されるカラーコーディング方法です。これら 3 つの変数は、ピクセルの明るさ (Y)、赤成分と明るさの間の信号の差 (U)、および青と明るさの間の差 (V) を表します。このカラー モデルは主にビデオや画像の送信に使用され、このモデルの生成はテレビの開発と密接に関係しています。カラー テレビは白黒テレビの後に登場したため、カラー テレビのビデオ信号は白黒テレビと互換性がある必要があります。カラーテレビではカラーを表示するために 3 チャンネルのデータが必要ですが、白黒テレビでは 1 チャンネルのデータしか必要ないため、ビデオ信号をカラーテレビと白黒テレビで互換性を持たせるために、RGB エンコード方式を YUV に変換します。エンコード方式です。その Y チャンネルは画像の明るさです。白黒 TV は白黒ビデオ画像を表示するためにのみこのチャンネルを使用する必要があり、カラー カメラは YUV エンコードを RGB エンコードに変換することでカラー TV にカラー画像を表示できます。同じビデオ信号が異なるタイプのテレビと互換性があるという問題。RGB モデルと YUV モデル間の変換関係は式に示されています。RGB の値の範囲は 0 ~ 255 です。
ここに画像の説明を挿入

3. HSV(HSB)カラーモデル

HSV は Hue、Saturation、Value の略称であり、この 3 つの特性によって色を表現するモデルであることが名前からもわかります。彩度は色の基本的な属性であり、私たちが通常言う赤、青などの色であり、彩度は色の純度を指し、彩度が​​高いほど色はより純粋で明るく、彩度が低いほど色は明るくなります。彩度、色は徐々に灰色になります 暗く、彩度の値の範囲は 0 ~ 100%、明るさは色の明るさで、値の範囲は 0 ~ コンピュータで許可される最大値です。色相、彩度、明度の値の範囲が異なるため、色空間モデルを円錐で表し、その形状を図 3-2 に示します。RGB モデルの 3 つの色コンポーネントと最終的な色の間の関係が直観的ではないという欠点と比較して、HSV モデルは人間の色の認識方法 (色、深さ、明るさ) により一致しています。
ここに画像の説明を挿入
RGB=>HSB

V=max(R,G,B)
S=(V-min(R,G,B))*255/V V!=0 の場合、それ以外の場合は 0

   (G - B)*60/S,  if V=R

H= 180+(B - R)*60/S (V=G の場合)
240+(R - G)*60/S (V=B の場合)

H<0 の場合、H=H+360
0°から 360°まで上記の式を使用して色相 (色相) の値を計算し、2 で割った後 8 ビットに使用できることを確認します。

4.LABカラーモデル

Lab カラー モデルは、RGB モデルの欠点を補うもので、デバイスに依存しないカラー モデルであり、生理学的特性に基づいたカラー モデルです。モデルでは、L は輝度を表し、a と b は 2 つのカラー チャネルで、どちらも -128 から +127 の範囲で、チャネル a の対応する色は緑から大に変化します。赤、b チャネル値は小から大に変化します。青から黄色までの色に対応します。それが構成する色空間は球であり、その形状を図 3-3 に示します。
ここに画像の説明を挿入

5、GRAYカラーモデル

GRAY モデルはカラー モデルではなく、グレースケール画像モデルであり、その名前には英語の単語 grey の大文字が使用されています。グレースケール画像にはチャネルが 1 つだけあり、グレースケール値は画像の桁数に応じて 0 から最大値まで順番に黒から白で表されます。たとえば、8UC1 形式では、黒から白は 256 レベルに量子化されます。 0 ~ 255 で表され、255 は白を意味します。カラー画像には豊かな色と高い情報量という特徴がありますが、グレースケール画像には画像処理において一定の利点があります。たとえば、グレースケール画像には、同じサイズと同じ圧縮形式、小さい容量、収集しやすい、送信しやすいという利点があります。一般的に使用される RGB モデルは、式に示すようにグレースケール画像に変換されます。
ここに画像の説明を挿入

6.CMYKカラーモード

カラー印刷時に使用するカラーモードです。シアン、マゼンタ、イエロー、ブラックの 4 色で構成されます。黒をKで表すのは、RGBの三原色の青(Blue、Bで表す)との混同を避けるためです。このモードの作成基準は RGB とは異なり、光の追加ではなく、光の減算に依存します。これは、モニターやテレビとは異なり、印刷用紙は光源を作成できず、光を発することもできず、光を吸収して反射することしかできないためです。したがって、上記の 4 つの色の組み合わせによって、可視スペクトルのほとんどの色を生成できます。

RGB<=CMYK

R = (255 - C) * ((255 - K) / 255)
G = (255 - M) * ((255 - K) / 255)
B = (255 - Y) * ((255 - K) / 255 )

7.グレーモデル

これはカラー モデルではなく、グレースケール画像モデルであり、その名前には英語の単語グレーの大文字が使用されています。グレースケール画像にはチャネルが 1 つだけあり、グレースケール値は画像のビット数に応じて 0 から最大値まで黒から白を順番に表します。一般的に使用される RGB モデルはグレースケール イメージに変換されます。
ここに画像の説明を挿入

八、異なる色の変換

画像の異なるカラーモデル間の相互変換のために、OpenCV 4 では変換機能を実現する cvtColor() 関数が提供されており、この関数の関数プロトタイプは次のとおりです。

void cv::cvtColor(InputArray src,
                  OutputArray dst,
                  int code,
                  int dstCn = 0)

src: 変換するカラーモデルの元の画像。
dst: カラーモデル変換後の出力先画像。
code: RGB 空間から HSV 空間へなどの色空間変換のフラグ。一般的な記号とその意味を表 3-1 に示します。
dstCn: ターゲット イメージのチャネル数。パラメータが 0 の場合、チャネル数は src と code から自動的に導出されます。

この関数は、画像をあるカラー モデルから別のカラー モデルに変換するために使用されます。最初の 2 つのパラメーターは、変換する画像と変換後の色空間のターゲット画像を入力するために使用されます。3 番目のパラメーターは、特定の変換モデルを宣言するために使用されます。関数のスペース。通常、4 番目のパラメータには特別な設定は必要なく、デフォルトのパラメータを使用できます。関数変換前後の画像の値の範囲は、8 ビット符号なし画像のピクセルは 0 ~ 255、16 ビット符号なし画像のピクセルは 0 ~ 65535 であることに注意してください。 32 ビット浮動小数点画像のピクセルは 0 から 1 までであるため、ターゲット画像のピクセル範囲に必ず注意してください。線形変換の場合、範囲の問題を考慮する必要はなく、ターゲット画像のピクセルが範囲外になることはありません。非線形変換の場合、正しい結果を得るために入力 RGB 画像を適切な範囲に正規化する必要がある場合 (たとえば、8 ビット符号なし画像を 32 ビット浮動小数点画像に変換する場合)、最初に次のことを行う必要があります。誤った結果を防ぐために、画像のピクセルを 0 ~ 1 の範囲にスケールされた 255 で除算します。
[注意] 変換プロセス中にアルファ チャネル (透明度を示す RGB モデルの 4 番目のチャネル) が追加される場合、その値は対応するチャネル範囲の最大値に設定されます: CV_8U は 255、CV_16U は 65535、CV_32F直感的な場合は 1 です
ここに画像の説明を挿入
。同じ画像が異なる色空間でどのように見えるかを感じるために、以前のカラー モデルを相互に変換するプログラムをコード リスト 3-2 に示します。実行結果を図 3-4 に示します。Lab カラー モデルには負の数値があり、imshow() 関数を通じて表示される画像は負の数値を表示できないことに注意してください。そのため、結果は、Lab モデルの Image Watch プラグインによって表示される画像がどのように見えるかを示しています。プログラムでは、変換後に値が範囲外にならないように、まず CV_8U タイプを CV_32F タイプに変換し、次にカラー モデルを変換します。

#include<iostream>
#include<vector>
#include<string>
#include <opencv2/opencv.hpp>
#include "opencv/highgui.h"

using namespace std;
using namespace cv;

int main(int argc,char** argv) {
    
    
    cout<<"OpenCv Version: "<<CV_VERSION<<endl;
    Mat img=imread("/home/wyh/Documents/C++demo/699342568.jpg");
    if(img.empty()){
    
    
        cout<<"请确认图像文件名称是否正确"<<endl;
        return -1;
    }
    Mat dst;
    resize(img,dst,Size(img.cols*0.5,img.rows*0.5));
    Mat gray,HSV,YUV,Lab,img32;
    dst.convertTo(img32,CV_32F,1.0/255);//将CV_8U类型转换成CV_32F类型
    cvtColor(img32,HSV,COLOR_BGR2HSV);
    cvtColor(img32,YUV,COLOR_BGR2YUV);
    cvtColor(img32,Lab,COLOR_BGR2Lab);
    cvtColor(img32,gray,COLOR_BGR2GRAY);
    imshow("原图",dst);
    imshow("HSV",HSV);
    imshow("YUV",YUV);
    imshow("Lab",Lab);
    imshow("gray",gray);
    waitKey(10000);
    return 0;
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/jiyanghao19/article/details/131249307