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

Javaでカラー画像をセピア調に変換する方法|初心者向けにサンプルコード付きで解説

セピア調とは、古い白黒写真特有の温かみのある黄褐色トーンのことで、画像にノスタルジックな雰囲気を演出できる人気のエフェクトです。本記事では、Javaの標準ライブラリ(ImageIO・BufferedImage)を使って、カラー画像をセピア調に変換する方法を、アルゴリズムの仕組みから実際のコードまで順を追って解説します。

カラー画像をセピアに変換するアルゴリズム

セピア変換は、各ピクセルのRGB(赤・緑・青)の値を一定のルールで書き換えることで実現します。具体的な手順は以下の通りです。

  1. 各ピクセルのRGB値を取得する
  2. 3色の平均値を計算する … この平均値が変換後の明るさの基準になります。
  3. depth(深さ)とintensity(強度)を定義する … 推奨値はそれぞれ20と30です。この数値でセピアの色味の強さを調整できます。
  4. RGB値を以下の式で書き換える
    • red = red + (depth × 2)
    • green = green + depth
    • blue = blue − intensity
  5. 値を0〜255の範囲に収める … 255を超えた場合は255に、0未満の場合は0に丸めます。
  6. 修正後のRGB値から新しいピクセルを作成し、画像に設定する

Javaでの実装手順

続いて、上記アルゴリズムをJavaで実装する流れを見ていきましょう。

  1. ImageIO.read() メソッドで変換したい画像ファイルを読み込みます。
  2. getHeight() / getWidth() メソッドで画像の高さと幅を取得します。
  3. ネストしたforループで画像内の全ピクセルを走査します。
  4. getRGB() メソッドでピクセル値を取得します。
  5. 取得したピクセル値を引数として Color オブジェクトを生成します。
  6. getRed()getGreen()getBlue() メソッドで、それぞれ赤・緑・青の値を取り出します。
  7. アルゴリズムの式に従って、新しいRGB値を計算します。
  8. 修正後のRGB値で新しい Color オブジェクトを作成します。
  9. setRGB() メソッドで新しいピクセル値を画像に書き込みます。

サンプルコード

以下は、指定した画像ファイルを読み込み、セピア変換を行った結果を別ファイルとして保存する完全なサンプルです。

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

public class Color2Sepia {
    public static void main(String args[]) throws IOException {
        // 画像の読み込み
        File file = new File("D:\\Images\\cuba.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);

                // 赤・緑・青の値を取得
                int red = color.getRed();
                int green = color.getGreen();
                int blue = color.getBlue();

                // 3色の平均値を計算
                int avg = (red + green + blue) / 3;

                // 深さと強度の定義
                int depth = 20;
                int intensity = 30;

                // セピア変換用にRGB値を補正
                red = avg + (depth * 2);
                green = avg + depth;
                blue = avg - intensity;

                // RGB値が0〜255の範囲に収まるように調整
                if (red > 255) red = 255;
                if (green > 255) green = 255;
                if (blue > 255) blue = 255;
                if (blue < 0) blue = 0;

                // 新しいColorオブジェクトを作成
                color = new Color(red, green, blue);

                // 新しい色を画像に設定
                img.setRGB(x, y, color.getRGB());
            }
        }

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

入力画像

Javaでカラー画像をセピア調に変換する方法|初心者向けにサンプルコード付きで解説

出力画像

Javaでカラー画像をセピア調に変換する方法|初心者向けにサンプルコード付きで解説

まとめ

セピア変換のポイントは、各ピクセルのRGB平均値を基準に、赤を強め(+40)、緑をやや強め(+20)、青を弱め(−30)に補正することです。これにより、画像全体が均一な明るさを持つ黄褐色のトーンへと変わり、セピア調の仕上がりになります。depthやintensityの値を変更すれば色味の濃淡を自由に調整できるので、ぜひいろいろな値を試してみてください。

  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:保存先のファイルパスを表す文字列