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

OpenCVのダイレクトアクセス方式でピクセル値を変更する方法

ダイレクトアクセス方式とは

前回紹介した「at」メソッドでは、ピクセル値にアクセスする際に画像の型を指定する必要がありました。これよりもさらにシンプルな方法が「ダイレクトアクセス方式」です。この方式を使用する場合は、Mat<uchar>、Mat<Vec3b>、Mat<Vec2i> のような Mat テンプレート型を明示的に指定します。型を指定しておけば、配列のように image(行, 列) という形式で直接ピクセル値を読み書きできるため、コードが簡潔になります。

サンプルコード

以下のプログラムは、OpenCVでダイレクトアクセス方式を使ってピクセル値を変更する例です。ランダムな位置のピクセルを黒(0)に設定することで、画像にノイズを加えています。

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;//cv名前空間の宣言
using namespace std;
void direct_access(Mat_<Vec3b> &image, int n){ //関数の宣言
    for (int x = 0; x < n; x++){ //forループの開始
        int i = rand() % image.cols;//ランダムな列を選択
        int j = rand() % image.rows;//ランダムな行を選択
        image(j, i) = 0;//ピクセル値を0(黒)に設定
    }
}
int main() {
    Mat_<Vec3b> image;//画像行列の宣言
    Mat unchanged_Image;//比較用の画像行列
    image = imread("sky.jpg");//画像の読み込み
    unchanged_Image = imread("sky.jpg");//同じ画像を読み込み
    namedWindow("Noisy Image");//ウィンドウの作成
    namedWindow("Unchanged Image");//もう一つのウィンドウを作成
    direct_access(image, 4000);//ダイレクトアクセス関数を呼び出し
    imshow("Noisy Image", image);//ノイズ画像を表示
    imshow("Unchanged Image", unchanged_Image);//元の画像を表示
    waitKey(0);//キー入力を待機
    return 0;
}

実行結果

OpenCVのダイレクトアクセス方式でピクセル値を変更する方法

コードのポイント

  • Mat_<Vec3b> 型の使用: カラー画像(BGR形式)を扱うために Mat_<Vec3b> を指定しています。これにより image(j, i) の形でピクセルに直接アクセス可能になります。
  • ランダム座標の生成: rand() % image.colsrand() % image.rows により、画像サイズの範囲内でランダムな列・行の座標を取得しています。
  • ピクセル値の変更: image(j, i) = 0 とすると、そのピクセルの B・G・R すべてのチャンネルが 0 に設定され、黒い点として表示されます。
  • 4000回の繰り返し: 関数に渡した引数 n の回数だけ処理を繰り返すため、ノイズの量を自由に調整できます。

このように、ダイレクトアクセス方式を使えば「at」メソッドよりも直感的かつ簡潔にピクセル操作を行えます。大量のピクセルを処理する場合や、可読性の高いコードを書きたい場合に特に有効です。

  1. Javaで画像のピクセル(RGB値)を設定・変更する方法

    ピクセルとはデジタル画像を構成する最小単位の要素であり、各ピクセルにはアルファ(透明度)、赤、緑、青の4つの値が含まれています。ピクセル値は32ビットのメモリ領域に、ARGBの順序で各8ビットずつ格納されています。そのため、画像の色を変更するには、以下の手順を実行する必要があります。画像内のすべてのピクセルを順番にループ処理する。getRGB()メソッドを使用してピクセル値を取得する。ピクセル値からARGB値を取り出す。RGB値に対して必要な変更を加える。変更後のRGB値で新しいピクセル値を作成する。setRGB()メソッドを使用して新しいピクセル値を設定する。ARGB値を設定する方法まず、ピ

  2. Pythonでscikit-learnを使って画像のピクセル値を取得・表示する方法

    データの前処理とは、さまざまなリソース(または単一のリソース)から収集したすべてのデータを、共通のフォーマットや統一されたデータセットへとまとめる作業を指します。現実世界のデータは決して完璧ではないため、欠損セルやエラー、外れ値、列間の不整合などが含まれている可能性があります。画像の場合も同様に、正しく配置されていなかったり、ぼやけていたり、ファイルサイズが非常に大きかったりすることがあります。前処理の目的は、こうした不整合やエラーを取り除くことにあります。画像のピクセル値を取得するには、組み込み関数「flatten」を使用します。画像を読み込んだ後、ピクセル値はデータフレームの形式で保存され