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

JavaでOpenCVを使わずに画像をグレースケールに変換する方法

Javaの標準ライブラリだけを使えば、OpenCVなどの外部ライブラリに頼ることなく、カラー画像をグレースケール(白黒)画像へ変換できます。基本的な考え方はシンプルで、各ピクセルが持つ赤(R)・緑(G)・青(B)の3つの値を取り出し、その平均値を計算して、元のRGB値をその平均値で置き換えるというものです。

グレースケール変換の手順

  • 各ピクセルから赤・緑・青(RGB)の値を取得する
  • 3色の平均値を求める
  • 元のRGB値をその平均値に置き換える
  • 変更後の色から新しいピクセル値を作成する
  • その新しい値をピクセルに設定する

この処理を画像内のすべてのピクセルに対して繰り返し適用することで、画像全体をグレースケール化できます。以下に、BufferedImageImageIOを使用した具体的な実装例を示します。

サンプルコード

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

public class Color2Grey {
    public static void main(String args[]) throws IOException {
        // 画像を読み込む
        File file = new File("D:\\Images\\car.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();
                // RGBの平均値を計算
                int average = (red + green + blue) / 3;
                // 新しいColorオブジェクトを作成
                color = new Color(average, average, average);
                // 新しい色を画像に設定
                img.setRGB(x, y, color.getRGB());
            }
        }

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

処理の流れの解説

まずImageIO.read()メソッドで画像ファイルを読み込み、BufferedImageオブジェクトとして扱います。次に、二重のforループを使って画像の縦・横すべてのピクセルにアクセスします。getRGB(x, y)メソッドは指定した座標のピクセル値を整数として返すため、それをColorオブジェクトに変換して個々の色成分を取り出します。

取得した赤・緑・青の値を合計して3で割ると平均値が得られます。この平均値をR・G・Bすべてに設定した新しいColorオブジェクトを作成し、setRGB()メソッドでピクセルに書き戻します。これにより、そのピクセルは明度に応じた灰色になります。

最後にImageIO.write()メソッドで加工済みの画像を新しいファイルとして保存すれば完成です。なお、より正確なグレースケール変換を行いたい場合は、単純な平均ではなく「0.299×R + 0.587×G + 0.114×B」という輝度重み付けの計算式を使うと、人間の目の感度特性に近い自然な仕上がりになります。

入力画像

JavaでOpenCVを使わずに画像をグレースケールに変換する方法

出力画像

JavaでOpenCVを使わずに画像をグレースケールに変換する方法

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

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

  2. OpenCVで画像をカラーからグレースケールに変換する方法

    この記事では、OpenCVを使って画像のカラー表現をRGB(BGR)からグレースケールへ変換する方法を解説します。グレースケール変換は、エッジ検出や物体認識などの画像処理を行う前段階としてよく使われる、最も基本的なテクニックの一つです。アルゴリズムステップ1:OpenCVをインポートする。 ステップ2:imread()関数で元画像を読み込む。 ステップ3:cv2.cvtColor()関数を使ってグレースケールに変換する。サンプルコードimport cv2 image = cv2.imread(colourful.jpg) cv2.imshow(Original, image) grayscal