ホームページ >ウェブフロントエンド >PS チュートリアル >OpenCV成長への道(3):PhotoShopの魔法の杖ツールを真似してみる
この記事のテーマは、実際には色選択プログラムを使用した画像の色空間の変換であり、OpenCV の色変換関数の使用法といくつかの注意事項について説明します。
RGB 色空間: RGB は、色を生成するためのさまざまな「光」の比率を記述するため、加法混色手法を使用します。暗闇から始まり、光が重なり合い、色を生み出します。 RGB は、赤、緑、青の光の値を表します。デジタル画像の保存には通常、RGB モードが使用されます。OpenCV の 3 つのチャネルの保存順序は BGR であることに注意してください。
HSV、HSI: これら 2 つのカラー形式は、人間の目の色の区別に基づいて定義されます。H (色相) は色相を表し、S (彩度) は彩度を表し、V (値) は明るさを表し、I (強度) は明るさを表します。 。
Lab 空間: モデル内の均一な変化は、知覚される色の均一な変化に対応するため、Lab を色空間内の点として想像できます。隣接する点が近ければ近いほど、2 つの色は近づきます。そのため、ラボ スペースは 2 つの色の類似性を測定するためによく使用されます。
色空間の詳細については、http://en.wikipedia.org/wiki/Color_space
OpenCV は、cvtColor 関数を使用して画像の色変換を完了します。 cvtColor は opencv2/imgproc/imgproc.hpp ヘッダー ファイルで定義されており、その C++ インターフェイスは次のとおりです:
void cvtColor(InputArray src, OutputArray dst, int code, int ) dstCn = 0 )
src: 入力画像。
dst: 出力画像。
コード: CV_BGR2Lab、CV_BGR2HSV、CV_HSV2BGR、CV_BGR2RGB などの色変換タイプ。
dstCn: 出力画像のチャンネル番号。デフォルトが 0 の場合、入力画像のチャンネル数を意味します。
BGR から Lab に画像を変換します: cvtColor(image,image,CV_BGR2Lab)
まず colorDetect クラスを定義します:
class colorDetect{private: int minDist; //minium acceptable distance Vec3b target;//target color; Mat result; //the resultpublic: colorDetect(); void SetMinDistance(int dist); void SetTargetColor(uchar red,uchar green,uchar blue); void SetTargetColor(Vec3b color); //set the target color Mat process(const Mat& image); //main process};
minDist は距離を制限するために定義したしきい値です。 2 つの色の間の値は、PhotoShop の魔法の杖ツールのしきい値に相当します。
target はシードカラーに相当するターゲットカラーです。 result は、ストレージ処理によって得られた結果です。
processはメインの処理プログラムです。 processの中身を見てみましょう。
Mat colorDetect::process(const Mat& image) { Mat ImageLab=image.clone(); result.create(image.rows,image.cols,CV_8U); //将image转换为Lab格式存储在ImageLab中 cvtColor(image,ImageLab,CV_BGR2Lab); //将目标颜色由BGR转换为Lab Mat temp(1,1,CV_8UC3); temp.at<Vec3b>(0,0)=target;//创建了一张1*1的临时图像并用目标颜色填充 cvtColor(temp,temp,CV_BGR2Lab); target=temp.at<Vec3b>(0,0);//再从临时图像的Lab格式中取出目标颜色 // 创建处理用的迭代器 Mat_<Vec3b>::iterator it=ImageLab.begin<Vec3b>(); Mat_<Vec3b>::iterator itend=ImageLab.end<Vec3b>(); Mat_<uchar>::iterator itout=result.begin<uchar>(); while(it!=itend) { //两个颜色值之间距离的计算 int dist=static_cast<int>(norm<int,3>(Vec3i((*it)[0]-target[0], (*it)[1]-target[1],(*it)[2]-target[2]))); if(dist<minDist) (*itout)=255; else (*itout)=0; it++; itout++; } return result; }
プログラムでは特に注意が必要な点が 2 つあります:
1. 画像を Lab 空間に変換した後、一時的な画像を作成することでターゲットの色も変換する必要があります。
2. ノルム関数は、2 つの色の間の距離を決定するために使用されます。その演算は、norm
次に、 Vec3i((*it)[0]-target[0],(*it)[1]-target[1],(*it)[2]-target[2] ) が置き換えられるかどうかを検討する価値があります。 by Vec3i((*it)-target)?答えは「ノー」です。なぜなら、(*it)-target は実際の操作中に減算結果の型を自動的に制限するからです。
次のようにターゲットの色としきい値を設定した後、サンプル効果を取得できます:
cdet.SetTargetColor(150,150,150);
cdet.SetMinDistance(50);
その他の OpenCV 成長パス (3 ): 記事用PhotoShop の魔法の杖ツールの模倣に関連して、PHP 中国語 Web サイトに注意してください。