Javaで画像をネガティブ(反転)に変換する方法|アルゴリズムと実装コードをわかりやすく解説
画像をネガティブに変換するアルゴリズム
カラー画像をネガティブ(階調反転)画像に変換する仕組みは非常にシンプルです。基本となる手順は以下の4ステップです。
- 各ピクセルの赤(R)・緑(G)・青(B)の値を取得する
- それぞれの色の値を255から引き算し、新しい色の値として保存する
- 変更後の3つの色の値から、新しいピクセル値を生成する
- その新しい値を元のピクセルに設定する
この「255からの減算」により、明るい部分は暗く、暗い部分は明るくなり、写真のネガフィルムのような反転画像が完成します。
Javaによる実装手順
Javaでは、標準ライブラリの ImageIO クラスや Color クラスを利用することで、OpenCVなどの外部ライブラリに頼らずにネガティブ画像を生成できます。具体的な処理の流れは次のとおりです。
ImageIO.read()メソッドを使って、対象の画像ファイルを読み込む- 画像の高さと幅を取得する
- ネストしたforループで、画像内の全ピクセルを1つずつ走査する
getRGB()メソッドでピクセル値を取得する- 取得したピクセル値を引数として、
Colorオブジェクトを生成する getRed()・getGreen()・getBlue()メソッドで、それぞれR・G・Bの値を取り出す- アルゴリズムに従って、新しいR・G・Bの値を計算する
- 計算結果のRGB値を引数として、新しい
Colorオブジェクトを作成する setRGB()メソッドで、新しいピクセル値を画像に書き戻す
サンプルコード
import java.io.File;
import java.io.IOException;
import java.awt.Color;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class Color2Negative {
public static void main(String args[]) throws IOException {
// 画像を読み込む
File file = new File("D:\\Images\\car3.jpg");
BufferedImage img = ImageIO.read(file);
for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {
// ピクセルの値を取得
int pixel = img.getRGB(x, y);
// ピクセル値からColorオブジェクトを生成
Color color = new Color(pixel, true);
// R・G・Bの値を取り出す
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
// 255から減算してネガティブに変換
red = 255 - red;
green = 255 - green;
blue = 255 - blue;
// 新しいColorオブジェクトを作成
color = new Color(red, green, blue);
int newPixel = color.getRGB();
// 新しい色を画像に設定
img.setRGB(x, y, newPixel);
}
}
// 変換後の画像を保存
file = new File("D:\\Images\\negative_image.jpg");
ImageIO.write(img, "jpg", file);
System.out.println("Done...");
}
}このプログラムを実行すると、指定したパスの画像が読み込まれ、全ピクセルに対して反転処理が施された後、「negative_image.jpg」として保存されます。
入力画像

出力画像(ネガティブ変換後)

なお、画素数の大きな画像を扱う場合は、ピクセルごとのループ処理に時間がかかることがあります。パフォーマンスを重視する場合は、Raster クラスやバッファ配列を活用した一括処理を検討するとよいでしょう。
-
JavaのOpenCVライブラリでカラー画像をグレースケールに変換する方法
カラー画像をグレースケールに変換する基本OpenCVのImgprocクラスが提供するcvtColor()メソッドを使うと、画像の色空間を別の色空間へ変換できます。このメソッドは以下の3つのパラメータを受け取ります。src – 変換元の画像を表すMatオブジェクト(ソース)dst – 変換結果を格納するMatオブジェクト(出力先)code – 変換後の色空間を指定する整数値(カラーコード)カラー画像をグレースケールに変換する場合は、第3パラメータにImgproc.COLOR_RGB2GRAYを指定します。このコードはRGB形式の画像をグレースケール(白黒の濃淡表現)へ変換することを意味しています
-
JavaとOpenCVライブラリを使って画像を保存(書き出し)する方法
OpenCVライブラリを利用すると、画像フィルタリング、幾何学的変換、色空間の変換、ヒストグラム処理など、さまざまな画像処理操作を行うことができます。本記事では、その中でも基本的な操作である「画像の読み込みと保存(書き出し)」の方法を解説します。画像を書き出す(保存する)方法Imgcodecsクラスのimread()メソッドを使って画像を読み込むと、その内容はMat(Matrix)オブジェクトに格納されます。読み込んだ画像をファイルとして保存するには、imwrite()メソッドを使用します。imwrite()メソッドは、以下の2つの引数を受け取ります。file:保存先のファイルパスを表す文字列