C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++とOpenCVでマルチチャンネル画像のピクセル値を読み取る方法


OpenCVでカラー画像を扱う際、ピクセルごとの値にアクセスできると、画像処理の幅が大きく広がります。本記事では、C++を使用してBGR形式のマルチチャンネル画像からピクセル値を読み取る方法を解説します。

まず、blue_Channel、green_Channel、red_Channel という3つの変数を宣言します。これらの変数は、読み取ったピクセル値を保存するために使用され、後述のforループ内で活用します。次に、画像を読み込むための行列として color_image_Matrix を宣言します。

ピクセル値を読み取る基本構文

ピクセル値の読み取りには、Matクラスの at<Vec3b> メソッドを使用します。構文は以下の通りです。

blue_Channel = color_image_Matrix.at<Vec3b>(i, j)[0];

ここではBGR画像を使用しています。BGR画像は「青・緑・赤」の3つのチャンネルを持ち、この順序は固定です。color_image_Matrix.at<Vec3b>(i, j) は座標 (i, j) にあるピクセル値を表し、その後ろの [0] は最初のチャンネル(青)を指定します。

例えば、次のように記述した場合を考えてみましょう。

blue_Channel = color_image_Matrix.at<Vec3b>(30, 35)[0];

この場合、変数 blue_Channel には、座標 (30, 35) にある最初のチャンネル(青チャンネル)のピクセル値が代入されます。このように、at<Vec3b> とチャンネルのインデックスを組み合わせることで、OpenCVで任意の位置のピクセル値にアクセスできます。

なお、Vec3b は8ビット符号なし整数(uchar)3つで構成されるベクトル型で、BGR画像の1ピクセル分のデータを格納します。インデックス [0]、[1]、[2] はそれぞれ青(B)、緑(G)、赤(R)のチャンネルに対応しています。

サンプルプログラム

以下のプログラムは、RGB画像の各チャンネルのピクセル値をすべて読み取り、その値をコンソールウィンドウに表示します。

例

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;

int main() {
    int blue_Channel;
    int green_Channel;
    int red_Channel;
    Mat color_image_Matrix; // 画像を読み込むための行列を宣言 //
    color_image_Matrix = imread("colors.jpg"); // 行列に画像を読み込む //

    // 青チャンネルのピクセル値を読み取るforループ(開始) //
    for (int i = 0; i < color_image_Matrix.rows; i++) { // 行のループ //
        for (int j = 0; j < color_image_Matrix.cols; j++) { // 列のループ //
            blue_Channel = color_image_Matrix.at<Vec3b>(i, j)[0];
            // 最初のチャンネル(青)の値を読み取る //
            cout << "Value of pixel of blue channel" << "(" << i << "," << j << ")" << "="
                 << blue_Channel << endl; // コンソールウィンドウに値を表示 //
        }
    }
    // 青チャンネルのforループ(終了) //

    // 緑チャンネルのピクセル値を読み取るforループ(開始) //
    for (int i = 0; i < color_image_Matrix.rows; i++) { // 行のループ //
        for (int j = 0; j < color_image_Matrix.cols; j++) { // 列のループ //
            green_Channel = color_image_Matrix.at<Vec3b>(i, j)[1];
            // 2番目のチャンネル(緑)の値を読み取る //
            cout << "Value of pixel of green channel" << "(" << i << "," << j << ")" << "="
                 << green_Channel << endl; // コンソールウィンドウに値を表示 //
        }
    }
    // 緑チャンネルのforループ(終了) //

    // 赤チャンネルのピクセル値を読み取るforループ(開始) //
    for (int i = 0; i < color_image_Matrix.rows; i++) { // 行のループ //
        for (int j = 0; j < color_image_Matrix.cols; j++) { // 列のループ //
            red_Channel = color_image_Matrix.at<Vec3b>(i, j)[2];
            // 3番目のチャンネル(赤)の値を読み取る //
            cout << "Value of pixel of red channel" << "(" << i << "," << j << ")" << "="
                 << red_Channel << endl; // コンソールウィンドウに値を表示 //
        }
    }
    // 赤チャンネルのforループ(終了) //

    if (waitKey(0) == 27);
        cout << "Image read successfully…!";
    return 0;
}

出力

Image read successfully...

実行時間について

このプログラムの実行には数分かかる場合があります。これは、画像内のすべてのピクセルについて、各チャンネルの値を1つずつ読み取っているためです。そのため、完全な結果がコンソールに表示されるまでに時間がかかります。画像サイズが大きいほど処理時間は長くなる点に注意してください。

また、実用的な画像処理では、ptr メソッドやポインタを使った行単位のアクセス、あるいはOpenCVの組み込み関数を活用することで、処理を大幅に高速化できます。ピクセル単位のアクセスは学習やデバッグに便利ですが、大規模な画像を扱う場合はこれらの手法の検討をおすすめします。

  1. C++とOpenCVで画像のチャンネル数を取得する方法を解説

    この記事では、OpenCVを使って画像のチャンネル数を調べる方法について解説します。プログラムを実行すると、コンソール画面に画像のチャンネル数が表示されます。チャンネル数を取得するには、OpenCVが提供するchannels()メソッドを使用します。このメソッドは、Matクラスのオブジェクト(画像行列)に対して呼び出すことで、その画像のチャンネル数を整数値として返します。例えば、カラー画像の場合は通常3チャンネル(BGR)、グレースケール画像の場合は1チャンネルとなります。画像処理を行う際、扱っている画像がカラーかモノクロかを判別するために、チャンネル数の確認は非常に重要な処理の一つです。以下

  2. Java OpenCVライブラリを使って画像の明るさを変更する方法

    OpenCVのorg.opencv.core.Matクラスが提供するconvertTo()メソッドを使うと、行列に対して必要な演算を実行し、画像のコントラストや明るさを簡単に調整できます。このメソッドは以下の4つのパラメータを受け取ります。 mat − 計算結果を格納するための空の行列。ソース行列と同じサイズ・型である必要があります。 rtype − 出力行列の型を指定する整数値。負の値を指定した場合は、ソース行列と同じ型になります。 alpha − ゲイン値。0より大きい値を指定します(デフォルトは1)。この値を変更するとコントラストに影響します。 beta − バイアス値(デフォルトは