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