ImageJからOpenCVライブラリを利用する際に、ImageJの画像データとOpenCVの画像データの変換が重要となります。
具体的には以下のようになります。
ImageJ の ImagePlusクラス
↑↓
ImageJ の ImageProcessorクラス
↑↓
配列(byte[]、int[]など)
↑↓
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画像については、こちらを見てください。