【Java】OpenCVライブラリを使って画像のコントラストを変更する方法
画像の明るさやコントラストの増減は、画像のピクセル値を変換することで実現できます。この変換は、次のような数式で表されます。
g(i, j) = α ・ f(i, j) + β
ここで、各要素の意味は以下のとおりです。
- (i, j):ピクセルの位置(座標)
- α(ゲイン)と β(バイアス):変換のパラメータ
一般に、ゲインパラメータ α が画像のコントラストを制御し、バイアスパラメータ β が画像の明るさを制御します。
convertTo() メソッドについて
org.opencv.core.Mat クラスの convertTo() メソッドを使うと、指定した行列に対して必要な計算を実行し、画像のコントラストや明るさを変更できます。このメソッドは、以下の4つのパラメータを受け取ります。
- mat:結果を格納するための空の行列。ソース行列と同じサイズ・型である必要があります。
- rtype:出力行列の型を指定する整数値。負の値を指定した場合は、ソースと同じ型になります。
- alpha:ゲイン値。0より大きい値である必要があります(デフォルト値は 1)。
- beta:バイアス値(デフォルト値は 0)。
OpenCV Java ライブラリで画像のコントラストを変更する手順
convertTo() メソッドに渡す alpha 値によって、画像のコントラストが変化します。alpha の値が 1 未満(0に近いほど)の場合はコントラストが低下し、1 より大きい場合(最大255)はコントラストが強調されます。
具体的な手順は以下のとおりです。
loadLibrary()メソッドを使用して、OpenCV のネイティブライブラリを読み込みます。imread()メソッドを使用して、対象の画像を読み込み Mat オブジェクトに格納します。- 前の手順で取得した行列と同じサイズ・型を持つ空の行列を作成します。
- 空の行列、型を維持するための -1、コントラストを調整する alpha 値(0〜1 または 1〜100)、および beta 値として 0 を引数にして
convertTo()メソッドを呼び出します。 Imgcodecs.imwrite()メソッドを使用して、結果の行列を出力画像として書き込みます。
サンプルコード
以下は、画像のコントラストを実際に変更する Java プログラムの例です。
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
public class AlteringContrast {
public static void main(String[] args) {
// OpenCV コアライブラリの読み込み
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// ファイルから画像を読み込む
String file = "D:\\Images\\car3.jpg";
Mat src = Imgcodecs.imread(file, Imgcodecs.IMREAD_COLOR);
// 空の行列を作成
Mat dest = new Mat(src.rows(), src.cols(), src.type());
// 画像のコントラストを変更(alpha = 10)
src.convertTo(dest, -1, 10, 0);
// 結果の画像を書き出す
Imgcodecs.imwrite("D:\\Images\\altering_contrast_10.jpg", dest);
}
}入力画像と実行結果
上記のプログラムに対して入力画像として車の写真を使用すると、alpha 値の違いによって以下のような出力結果が得られます。
α 値: 0.5 の場合
alpha を 0.5 に設定すると、元の画像よりもコントラストが大きく低下し、全体的に淡くぼやけた印象になります。
α 値: 0.8 の場合
alpha を 0.8 に設定すると、ややコントラストが抑えられ、柔らかいトーンの画像になります。
α 値: 1.5 の場合
alpha を 1.5 に設定すると、コントラストが強調され、明暗の差がはっきりとした画像になります。
α 値: 2.0 の場合
alpha を 2.0 に設定すると、コントラストがさらに強まり、シャープでメリハリのある画像になります。
このように、convertTo() メソッドの alpha パラメータを調整するだけで、Java の OpenCV ライブラリを使って画像のコントラストを簡単に制御できます。用途に応じて適切な alpha 値を選択してください。
-
【Java入門】ネガティブ画像をポジティブ画像に変換する方法|BufferedImageでピクセル単位のRGB反転を実装
ネガティブ(反転)画像を元のポジティブ画像に戻すには、画像内のすべてのピクセルに対して、赤(R)・緑(G)・青(B)の各値を「255 − 値」で反転させます。透明度を表すアルファ(A)成分はそのまま維持します。この操作は可逆的なため、同じロジックでポジ→ネガ→ポジの往復変換にも対応できます。 ネガ画像からポジ画像への変換手順 画像の読み込み: ImageIO.read() メソッドで対象の画像ファイルを読み込みます。 サイズの取得: getHeight() と getWidth() で画像の高さと幅を取得します。 ピクセル走査: 二重の for ループで画像内の全ピクセルを順番に処理します。
-
JavaとOpenCVライブラリを使って画像を保存(書き出し)する方法
OpenCVライブラリを利用すると、画像フィルタリング、幾何学的変換、色空間の変換、ヒストグラム処理など、さまざまな画像処理操作を行うことができます。本記事では、その中でも基本的な操作である「画像の読み込みと保存(書き出し)」の方法を解説します。画像を書き出す(保存する)方法Imgcodecsクラスのimread()メソッドを使って画像を読み込むと、その内容はMat(Matrix)オブジェクトに格納されます。読み込んだ画像をファイルとして保存するには、imwrite()メソッドを使用します。imwrite()メソッドは、以下の2つの引数を受け取ります。file:保存先のファイルパスを表す文字列