画像データの変換例

17th October 2021 at 8:44pm

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画像については、こちらを見てください。


HomeへImageJの記事Topへ