OpenCV成長への道(3):PhotoShopの魔法の杖ツールを真似してみる

高洛峰
リリース: 2017-02-20 09:09:25
オリジナル
1520 人が閲覧しました

この記事のテーマは、実際には色選択プログラムを使用した画像の色空間の変換であり、OpenCV の色変換関数の使用法といくつかの注意事項について説明します。

1. いくつかの一般的な色空間:

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

2. OpenCV での色空間変換

OpenCV は、cvtColor 関数を使用して画像の色変換を完了します。 cvtColor は opencv2/imgproc/imgproc.hpp ヘッダー ファイルで定義されており、その C++ インターフェイスは次のとおりです:

voidcvtColor(InputArraysrc, OutputArraydst, intcode, int) dstCn= 0)

src: 入力画像。

dst: 出力画像。

コード: CV_BGR2Lab、CV_BGR2HSV、CV_HSV2BGR、CV_BGR2RGB などの色変換タイプ。

dstCn: 出力画像のチャンネル番号。デフォルトが 0 の場合、入力画像のチャンネル数を意味します。

BGR から Lab に画像を変換します: cvtColor(image,image,CV_BGR2Lab)

3. シンプルな魔法の杖プログラム

まず 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(0,0)=target;//创建了一张1*1的临时图像并用目标颜色填充 cvtColor(temp,temp,CV_BGR2Lab); target=temp.at(0,0);//再从临时图像的Lab格式中取出目标颜色 // 创建处理用的迭代器 Mat_::iterator it=ImageLab.begin(); Mat_::iterator itend=ImageLab.end(); Mat_::iterator itout=result.begin(); while(it!=itend) { //两个颜色值之间距离的计算 int dist=static_cast(norm(Vec3i((*it)[0]-target[0], (*it)[1]-target[1],(*it)[2]-target[2]))); if(dist
        
ログイン後にコピー


プログラムでは特に注意が必要な点が 2 つあります:

1. 画像を Lab 空間に変換した後、一時的な画像を作成することでターゲットの色も変換する必要があります。

2. ノルム関数は、2 つの色の間の距離を決定するために使用されます。その演算は、norm (v) です。ここで、v は次元ベクトルです。プログラムでは、2 つの色の値を差し引いた結果の 3 次元の適切な量になります。

次に、 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の魔法の杖ツールを真似してみる

その他の OpenCV 成長パス (3 ): 記事用PhotoShop の魔法の杖ツールの模倣に関連して、PHP 中国語 Web サイトに注意してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!