2014年1月30日木曜日

ImageJのROIをmatlabで読み込む方法。

2014.Jan.30
 ImageJで作ったROIをmatlabに読み込む関数は以下のリンクから得ることができます。

http://www.dylan-muir.com/articles/read_ij_roi/
http://www.mathworks.com/matlabcentral/fileexchange/32479-import-imagej-rois

[sROI] = ReadImageJROI(RoiSetFile); 

使い方は簡単で、RoiSetFileに'.roi'ファイルかまたは'.zip'ファイルのフルパスを入力すれば読み込めます。
.zipの場合はセルを自動で作ってその中に全roi情報が格納されるようです。

セルの中に、mnCoordinatesという項目があってそこに、x座標とy座標の情報が登録されています。よって、

       xv = sROI{1,m}.mnCoordinates(:,1);
      yv = sROI{1,m}.mnCoordinates(:,2);

とすれば、m番目のROIの座標情報が取得できます。

 さて、問題は、取得できる情報は輪郭だけなので、囲んだ内部の情報が得たい場合は少し工夫が必要なようです。

今回は愚直に、512x512全ピクセルをスキャンして、その輪郭の内部にあるかないかを判定する関数、inpolygonを用いました。

あまり賢い方法とは言えないですが、これなら確実にROIの内部の座標が全部、indexに返ってきます。

indexの情報は新たに作ったROIindexというセルに全部放り込んで、後で取り出せるようにしておきます。

何かもっといい方法があったら教えて下さい。

例) 512x512画像の場合

function [ROIindex,numROI] = ReadROIindex(RoiSetFile)
% RoiSetFile = '0044-0257-0253.roi'
% RoiSetFile = 'RoiSet.zip'

    [sROI] = ReadImageJROI(RoiSetFile);
    numROI = size(sROI,2);
    ROIindex = cell([1,numROI]);

    for m = 1:numROI
        xv = sROI{1,m}.mnCoordinates(:,1);
        yv = sROI{1,m}.mnCoordinates(:,2);
        index = [];

        for x = 1:512
            for y = 1:512
                B = (x-1).*512+y;
                in = inpolygon(x,y,xv,yv);
                if in == 1
                   index = cat(1,index,B);
                end
            end
        end
        ROIindex{1,m} = index;      
    end
 
end