C++とOpenCVでバイナリ画像(二値画像)を作成する方法を解説
バイナリ画像(二値画像)とは、黒と白の2色のみで表現されるデジタル画像のことです。画像処理の観点から見ると、バイナリ画像は「0」と「1」という2つの値しか持たないピクセルで構成されています。ピクセルの値が0の場合は純粋な黒を、値が1の場合は純粋な白を表します。
グレースケール画像では、各ピクセルが256段階の異なる値を持つのに対し、バイナリ画像では2つの値しか存在しません。このシンプルさゆえに、バイナリ画像はさまざまな用途で活用されています。例えば、モルフォロジー変換(形態学的処理)ではバイナリ画像が必要であり、背景から物体の形状を抽出する処理にもバイナリ画像が用いられます。OpenCVを使用すれば、任意の画像を簡単にバイナリ画像へ変換することができます。
グレースケール画像への変換
まず、読み込んだ画像をグレースケール画像に変換する必要があります。以下のコードでは、「original_image」行列に格納された画像をグレースケール画像に変換し、「grayscale_image」行列に保存しています。
cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY);
threshold()関数で二値化を行う
次に、グレースケール画像をバイナリ画像に変換し、結果を「binary_image」行列に格納します。
threshold(grayscale_image, binary_image, 100, 255, THRESH_BINARY);
ここで、「grayscale_image」は入力元の行列、「binary_image」は出力先の行列です。その後にある「100」と「255」という2つの値は、しきい値(閾値)の範囲を表しています。この例では、100より大きいグレースケール値を持つピクセルが255(白)に変換され、それ以外のピクセルは0(黒)になります。
サンプルプログラム
以下のプログラムは、画像を読み込んでバイナリ画像に変換し、元画像と変換結果を並べて表示する完全なコード例です。
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat original_image;// 元画像を読み込むための行列を宣言//
Mat grayscale_image;// グレースケール画像を保存するための行列を宣言//
Mat binary_image;// バイナリ画像を保存するための行列を宣言
namedWindow("Original Image");// 元画像を表示するウィンドウを宣言//
namedWindow("Show Binary");// バイナリ画像を表示するウィンドウを宣言//
original_image = imread("teddy.jpg");// 画像を行列に読み込む//
cvtColor(original_image, grayscale_image, COLOR_BGR2GRAY);// BGRからグレースケールに変換し、結果を行列に保存//
threshold(grayscale_image, binary_image, 100, 255, THRESH_BINARY);// グレースケール画像をバイナリ画像に変換//
imshow("Original Image", original_image);// 元画像を表示//
imshow("Show Binary", binary_image);// バイナリ画像を表示//
waitKey(0);
return 0;
}実行結果
プログラムを実行すると、元のカラー画像と、しきい値処理によって白黒にはっきりと分離されたバイナリ画像がそれぞれ別のウィンドウに表示されます。しきい値の値を変更することで、白と黒の境界線がどのように変化するかを確認でき、画像の特徴に応じた最適な二値化処理を見つけることができます。
-
C++とOpenCVで画像を読み込んで表示する方法を徹底解説
この記事では、C++でOpenCVを使用して画像を読み込み、表示する方法について詳しく解説します。OpenCVで画像の読み込みや表示を行うには、以下のような関数やデータ構造が必要になります。 画像処理に必要な基本要素 Mat(マトリクス) Matは関数ではなく、データ構造の一種である変数型です。C++におけるint型やchar型、string型のように、MatはOpenCV独自の変数型であり、画像を格納するための行列(マトリクス)データ構造を作成します。プログラム内で「Mat myImage;」と記述した場合、「myImage」という名前の行列変数を宣言していることになります。 name
-
Javaで画像を左右反転!ミラーイメージ(鏡像)の作成方法を解説
画像を鏡のように左右反転させた「ミラーイメージ」は、Javaの標準ライブラリである ImageIO と BufferedImage を使えば簡単に作成できます。基本的な仕組みはシンプルで、元画像の各ピクセルを読み取り、その位置を水平方向に反転させて新しい画像へ書き込むだけです。ここでは、その具体的な手順とサンプルコードを紹介します。 ミラーイメージを作成する手順 ImageIO.read() メソッドを使用して、対象となる画像を読み込みます。 読み込んだ画像の高さと幅を取得します。 結果を格納するための空の BufferedImage オブジェクトを作成します。 ネストした for ループを