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

OpenCVのatメソッドを使ってピクセル値を変更する方法

グレースケール画像では、ピクセル値は単一の数値で表されます。一方、RGB画像のようなカラー画像では、ピクセルは3つの値を持つベクトルであり、それぞれの値が3つのチャンネルに対応しています。

この記事では、グレースケール画像とカラー画像の両方のピクセル値にアクセスし、ランダムにノイズを追加する関数を作成します。その後、main()関数の中からこの関数を呼び出して、実際の結果を確認します。

以下のプログラムは、OpenCVの「at」メソッドを使用してピクセル値を変更する方法を示したものです。

サンプルコード

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;//cv名前空間を宣言
using namespace std;
void adding_Noise(Mat& image, int n){ //「adding_Noise」関数
    for (int x = 0; x < n; x++){ //forループを開始
        int i = rand() % image.cols;//ランダムな列番号を取得
        int j = rand() % image.rows;//ランダムな行番号を取得
        if (image.channels() == 1){ //グレースケール画像にノイズを適用
            image.at<uchar>(j, i) = 0;//ピクセルの値を0に変更
        }
        if (image.channels() == 3){ //カラー画像にノイズを適用
            image.at<Vec3b>(j, i)[0] = 0;//1チャンネル目の値を変更
            image.at<Vec3b>(j, i)[1] = 0;//2チャンネル目の値を変更
            image.at<Vec3b>(j, i)[2] = 0;//3チャンネル目の値を変更
        }
    }
}
int main() {
    Mat image;//画像行列を宣言
    Mat unchanged_Image;//比較用のもう一つの画像行列を宣言
    image = imread("sky.jpg");//画像を読み込む
    unchanged_Image = imread("sky.jpg");//同じ画像を読み込む
    namedWindow("Noisy Image");//ウィンドウを宣言
    namedWindow("Unchanged Image");//別のウィンドウを宣言
    adding_Noise(image, 4000);//「adding_Noise」関数を呼び出す
    imshow("Noisy Image", image);//ノイズ付き画像を表示
    imshow("Unchanged Image",unchanged_Image);//元の画像を表示
    waitKey(0);//キー入力を待機
    destroyAllWindows();//割り当てられたメモリをすべて解放
    return 0;
}

コードのポイント

atメソッドによるピクセルへのアクセス

グレースケール画像の場合、各ピクセルはunsigned char型(0〜255)の単一の値として扱われるため、image.at<uchar>(j, i)のようにアクセスします。

カラー画像の場合、各ピクセルは3つのunsigned char値を持つVec3b型のベクトルです。image.at<Vec3b>(j, i)でピクセルにアクセスし、インデックス[0]、[1]、[2]で各チャンネルの値を個別に変更できます。なお、OpenCVは画像をBGRの順序で読み込むため、[0]が青、[1]が緑、[2]が赤に対応します。

ランダムな位置へのノイズ追加

rand() % image.colsrand() % image.rowsを使うことで、画像内のランダムな座標を生成しています。この処理を指定回数(ここでは4000回)繰り返し、選ばれたピクセルの値を0(黒)に設定することで、画像全体にランダムなノイズを加えています。

実行結果

OpenCVのatメソッドを使ってピクセル値を変更する方法

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

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

  2. Image Resizerで画像形式を変換する方法|初心者向けに手順をわかりやすく解説

    デジタル画像は、手元のスナップ写真とは違い、さまざまな用途に柔軟に活用できます。リサイズやトリミング、回転といった編集はもちろん、フォーマット(形式)の変更も自由自在です。ただし、これらの作業を行うには画像編集ツールが必要になります。Adobe Photoshopのような高機能ソフトもありますが、操作が難しく、初心者にはハードルが高いのが実情です。そこで本記事では、シンプルで直感的に使えるフリーツール「Image Resizer」を使って、デジタル写真の形式を変更する方法をご紹介します。このツールを使えば、誰でも簡単に画像を別の形式へ変換できます。Image Resizerの主な機能すでにお気