ImageJからOpenCVライブラリを利用する際に、ImageJの画像データとOpenCVの画像データの変換が重要となります。
具体的には以下のようになります。
ImageJ の ImagePlusクラス
- ・ ImageProcessor (2D 画像) や ImageStack (3D 画像)を含んだクラスです。
- ・ getChannelProcessor()メソッドを使って、ImageProcessorを得ることできます。
- ・ 得られるImageProcessorは、ImagePlusの画像データを参照しています。
↑↓
ImageJ の ImageProcessorクラス
- ・ getPixels()メソッドを使って、配列を得ることできます。
- ・ 得られる配列は、ImageProcessorの画像データを参照しています。
- ・ 8bitグレイスケール画像の時はbyte配列。RGB画像の時はint配列。
↑↓
配列(byte[]、int[]など)
- ・ Matクラスのget()メソッドやput()メソッドでデータのやり取りができます。
- ・ コピーです。
↑↓
OpneCV の Matクラス
「参照」とは、そのものを表しています、つまり、配列が画像データの「参照」であるである場合は、配列の数値を変更すると画像データも更新されます。
「コピー」とは、同じものを複写しています。つまり、Matクラスの内容がある配列の「コピー」だった場合には、配列の数値を変更してもMatクラスは更新されません。再度、「コピー」が必要です。
8bitグレイスケール画像の時のコードの例を以下に示します。(参考にしたコードはこちら)
@Override
public void run(ImageProcessor ip) // ExtendedPlugInFilterのrunメソッド
{
// ImageJにおける画像データ配列
int imw = ip.getWidth();
int imh = ip.getHeight();
byte[] srcdst_bytes = (byte[])ip.getPixels();
// Matクラスの作成
Mat src_mat = new Mat(imh, imw, CvType.CV_8UC1); // 元画像
Mat dst_mat = new Mat(imh, imw, CvType.CV_8UC1); // 結果画像
// Matクラスに画像データ配列をコピーして画像処理実行
// その後、結果を画像データ配列にコピー
src_mat.put(0, 0, srcdst_bytes);
Imgproc.equalizeHist(src_mat, dst_mat);
dst_mat.get(0, 0, srcdst_bytes);
}
RGB画像については、こちらを見てください。