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などにセットして画面に表示することが可能です。
-
【Java入門】ネガティブ画像をポジティブ画像に変換する方法|BufferedImageでピクセル単位のRGB反転を実装
ネガティブ(反転)画像を元のポジティブ画像に戻すには、画像内のすべてのピクセルに対して、赤(R)・緑(G)・青(B)の各値を「255 − 値」で反転させます。透明度を表すアルファ(A)成分はそのまま維持します。この操作は可逆的なため、同じロジックでポジ→ネガ→ポジの往復変換にも対応できます。 ネガ画像からポジ画像への変換手順 画像の読み込み: ImageIO.read() メソッドで対象の画像ファイルを読み込みます。 サイズの取得: getHeight() と getWidth() で画像の高さと幅を取得します。 ピクセル走査: 二重の for ループで画像内の全ピクセルを順番に処理します。
-
JavaのOpenCVライブラリでカラー画像をグレースケールに変換する方法
カラー画像をグレースケールに変換する基本OpenCVのImgprocクラスが提供するcvtColor()メソッドを使うと、画像の色空間を別の色空間へ変換できます。このメソッドは以下の3つのパラメータを受け取ります。src – 変換元の画像を表すMatオブジェクト(ソース)dst – 変換結果を格納するMatオブジェクト(出力先)code – 変換後の色空間を指定する整数値(カラーコード)カラー画像をグレースケールに変換する場合は、第3パラメータにImgproc.COLOR_RGB2GRAYを指定します。このコードはRGB形式の画像をグレースケール(白黒の濃淡表現)へ変換することを意味しています