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

【Java入門】ネガティブ画像をポジティブ画像に変換する方法|BufferedImageでピクセル単位のRGB反転を実装

ネガティブ(反転)画像を元のポジティブ画像に戻すには、画像内のすべてのピクセルに対して、赤(R)・緑(G)・青(B)の各値を「255 − 値」で反転させます。透明度を表すアルファ(A)成分はそのまま維持します。この操作は可逆的なため、同じロジックでポジ→ネガ→ポジの往復変換にも対応できます。

ネガ画像からポジ画像への変換手順

  • 画像の読み込み: ImageIO.read() メソッドで対象の画像ファイルを読み込みます。
  • サイズの取得: getHeight() と getWidth() で画像の高さと幅を取得します。
  • ピクセル走査: 二重の for ループで画像内の全ピクセルを順番に処理します。
  • ピクセル値の取得: getRGB() メソッドでピクセルの値を取得します。
  • 色成分の抽出: ピクセル値から各色成分を取り出すには、右シフトで該当ビットの開始位置まで移動し(アルファは24ビット、赤は16ビット、緑は8ビット)、0xff とのビットAND演算を行います。これにより下位8ビット以外がマスクされ、目的の1バイトだけが残ります。
  • 色の反転: 新しい R・G・B の値を、それぞれ255から引いて計算します。
  • ピクセルの再構築: A・R・G・B をそれぞれの桁位置へ左シフトし、ビットORで結合して新しいピクセル値を組み立てます。
  • ピクセルの書き戻し: setRGB() メソッドで新しいピクセル値を設定します。

サンプルコード

import java.io.File;
import java.io.IOException;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

public class Negative2Color {
    public static void main(String args[]) throws IOException {
        // 画像を読み込む
        File file = new File("D:\\Images\\cat_neg.jpg");
        BufferedImage img = ImageIO.read(file);

        for (int y = 0; y < img.getHeight(); y++) {
            for (int x = 0; x < img.getWidth(); x++) {
                // ピクセルの内容を取得
                int p = img.getRGB(x, y);

                // ピクセル値からA・R・G・Bの各値を取り出す
                int a = (p>>24) & 0xff;
                int r = (p>>16) & 0xff;
                int g = (p>>8)  & 0xff;
                int b = p       & 0xff;

                // 各RGB値を255から減算して反転
                r = 255 - r;
                g = 255 - g;
                b = 255 - b;

                // 新しいRGB値を組み立てて設定
                p = (a<<24) | (r<<16) | (g<<8) | b;
                img.setRGB(x, y, p);
            }
        }

        // 変換後の画像を保存
        file = new File("D:\\Images\\negative_positive.jpg");
        ImageIO.write(img, "jpg", file);
        System.out.println("Done...");
    }
}

入力画像(ネガティブ)

【Java入門】ネガティブ画像をポジティブ画像に変換する方法|BufferedImageでピクセル単位のRGB反転を実装

出力画像(ポジティブ)

【Java入門】ネガティブ画像をポジティブ画像に変換する方法|BufferedImageでピクセル単位のRGB反転を実装

ポイント解説

色の反転は「255 − 各チャンネルの値」というシンプルな計算で実現できます。これは光の三原色における補色関係に基づいており、ネガフィルムの原理と同じです。また、ビット演算では 0xff(16進数で255=8ビットすべて1)とのAND演算によって、不要な上位ビットを切り捨てている点に注目してください。大容量画像を扱う場合は、getRGB()/setRGB() を個別に呼び出す代わりに、getRGB(int startX, int startY, int w, int h, int[] rgbArray, ...) を使って配列として一括取得すると、処理速度を大幅に改善できます。

  1. JavaのOpenCVライブラリでカラー画像をグレースケールに変換する方法

    カラー画像をグレースケールに変換する基本OpenCVのImgprocクラスが提供するcvtColor()メソッドを使うと、画像の色空間を別の色空間へ変換できます。このメソッドは以下の3つのパラメータを受け取ります。src – 変換元の画像を表すMatオブジェクト(ソース)dst – 変換結果を格納するMatオブジェクト(出力先)code – 変換後の色空間を指定する整数値(カラーコード)カラー画像をグレースケールに変換する場合は、第3パラメータにImgproc.COLOR_RGB2GRAYを指定します。このコードはRGB形式の画像をグレースケール(白黒の濃淡表現)へ変換することを意味しています

  2. JavaとOpenCVライブラリを使って画像を保存(書き出し)する方法

    OpenCVライブラリを利用すると、画像フィルタリング、幾何学的変換、色空間の変換、ヒストグラム処理など、さまざまな画像処理操作を行うことができます。本記事では、その中でも基本的な操作である「画像の読み込みと保存(書き出し)」の方法を解説します。画像を書き出す(保存する)方法Imgcodecsクラスのimread()メソッドを使って画像を読み込むと、その内容はMat(Matrix)オブジェクトに格納されます。読み込んだ画像をファイルとして保存するには、imwrite()メソッドを使用します。imwrite()メソッドは、以下の2つの引数を受け取ります。file:保存先のファイルパスを表す文字列