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

JavaでOpenCVのMatオブジェクトをBufferedImageに変換する方法を解説

OpenCVのimread()メソッドを使って画像を読み込むと、戻り値としてMatオブジェクトが返されます。しかし、このMatオブジェクトの内容をAWTやSwingのウィンドウ上に表示したい場合は、java.awt.image.BufferedImageクラスのオブジェクトへ変換する必要があります。

本記事では、MatからBufferedImageへの変換手順を、サンプルコードとともにわかりやすく解説します。

MatをBufferedImageに変換する4つのステップ

1. MatをMatOfByteにエンコードする

まず、画像データを保持する行列(Mat)を、バイト列のマトリックスであるMatOfByteに変換します。これにはImgcodecsクラスのimencode()メソッドを使用します。

このメソッドは、第1引数に画像フォーマットを指定する文字列、第2引数に画像を表すMatオブジェクト、第3引数にMatOfByteオブジェクトを受け取ります。

2. MatOfByteオブジェクトをバイト配列に変換する

次に、toArray()メソッドを使って、MatOfByteオブジェクトをバイト配列(byte[])に変換します。

3. ByteArrayInputStreamをインスタンス化する

前のステップで作成したバイト配列をコンストラクタに渡して、ByteArrayInputStreamクラスのインスタンスを生成します。

4. BufferedImageオブジェクトを作成する

最後に、作成したInputStreamオブジェクトをImageIOクラスのread()メソッドに渡します。これにより、BufferedImageオブジェクトが返されます。

つまり全体の流れは、「Matをエンコードしてメモリ上のストリームにし、それをImageIOでデコードしてBufferedImageとして取得する」というものです。

サンプルコード

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;

public class Mat2BufferedImage {
    public static BufferedImage Mat2BufferedImage(Mat mat) throws IOException {
        // 画像をエンコード
        MatOfByte matOfByte = new MatOfByte();
        Imgcodecs.imencode(".jpg", mat, matOfByte);
        // エンコードしたMatをバイト配列に格納
        byte[] byteArray = matOfByte.toArray();
        // BufferedImageの準備
        InputStream in = new ByteArrayInputStream(byteArray);
        BufferedImage bufImage = ImageIO.read(in);
        return bufImage;
    }

    public static void main(String args[]) throws Exception {
        // OpenCVのコアライブラリを読み込み
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // ファイルから画像を読み込み
        String file = "C:/EXAMPLES/OpenCV/sample.jpg";
        Mat image = Imgcodecs.imread(file);
        BufferedImage obj = Mat2BufferedImage(image);
        System.out.println(obj);
    }
}

実行結果

BufferedImage@579bb367: type = 5 ColorModel: #pixelBits = 24 numComponents = 3
color space = java.awt.color.ICC_ColorSpace@1de0aca6 transparency = 1 has alpha =
false isAlphaPre = false ByteInterleavedRaster: width = 500 height = 360
#numDataElements 3 dataOff[0] = 2

実行結果から、画像の幅500ピクセル、高さ360ピクセルのBufferedImageオブジェクトが正しく生成されていることが確認できます。このように変換したBufferedImageは、SwingのJLabelなどにセットして画面に表示することが可能です。

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

    ネガティブ(反転)画像を元のポジティブ画像に戻すには、画像内のすべてのピクセルに対して、赤(R)・緑(G)・青(B)の各値を「255 − 値」で反転させます。透明度を表すアルファ(A)成分はそのまま維持します。この操作は可逆的なため、同じロジックでポジ→ネガ→ポジの往復変換にも対応できます。 ネガ画像からポジ画像への変換手順 画像の読み込み: ImageIO.read() メソッドで対象の画像ファイルを読み込みます。 サイズの取得: getHeight() と getWidth() で画像の高さと幅を取得します。 ピクセル走査: 二重の for ループで画像内の全ピクセルを順番に処理します。

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

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