画像の表示と出力
MATLABで数値行列として変数に格納した画像をFigureにして表示する。
基本的にimshow関数を使う。
グレースケール(モノクロ)画像もカラー画像も基本的なやり方は同じ。
アニメーション表示と動画出力についても説明する。
1.明るさの範囲を決める
imshow関数で画像を表示するとき、
どの数値が最も暗く表示され、どの数値が最も明るく表示されるかということを
念頭に置かなければならない。
Metamorphで画像を表示するときは自動で調節されるが、
Matlabでは自分で調節する必要がある。
imshow関数では、特に指定のない場合、数値行列として格納された画像のデータ型によって
明るさの範囲が決まる。
そのデータ型がとりうる最小値が最も暗く表示され、最大値が最も明るく表示される。
Metamorphで撮影、保存した画像は12ビット符号なし整数(0~4095)であることが多い。
このTiffファイルをimread関数やTiffクラスのreadメソッドで読み込むと、
Matlabにはuint12型が存在しないため、uint16型として格納される。
これをそのままimshow関数で表示すると、uint16がとりうる最大値である65535が
最も明るくなるように表示されるため、表示された画像は真っ暗になる。
明るさの範囲を決める方法は主に2つあり、
ひとつは以下のようにimshow関数の引数で範囲を設定する方法である。
imshow(image, [low, high])
lowに指定した値が最も暗く、highに指定した値が最も明るく表示される。
もう一つの方法は、幅と高さが同じでuint8の行列を新たに作り、
最も暗く表示したい値が0、最も明るく表示したい値が255となるように
元の画像を修正するやりかたである。
uint8以外の型でもいいが、モニターの表示方式は256段階が一般的であるため
uint8が必要十分である。
このとき、整数型のまま計算すると小数値をとれずバグが起こるので
double型に変換してから計算する。
明るさの範囲をどのように決めればいいのかは場合による。
画像の行列における最小値を最も暗く、最大値を最も明るくするのが簡単だが、
これだときれいに表示されないことがある。
蛍光顕微鏡画像の場合、異様に明るい細胞やごみのようなものが映っていると、
上のやり方ではうまく表示できない。明るすぎる値に明るさの範囲が引っ張られて、
全体的に暗くなってしまう。
Metamorphではこのような場合に対処するため、
intensityのヒストグラムをとり、明るさの範囲の外にあるピクセル数が
一定の割合になるように明るさの範囲を調整している。
サンプルコード。FRETImageProcess2クラス の Adjust関数
明るさの範囲を決めて画像を変換する
% -----------------------------------------------------------------------
% 画像をintensityが最大255,最小0になるように自動補正
function AdjustedImage = Adjust(Image)
% doubleに型変換
Image = double(Image);
% ratio画像(カラー)の場合、各色の画像を並べる
if size(Image,3) == 3
ref_image = [Image(:,:,1), Image(:,:,2), Image(:,:,3)];
else
ref_image = Image;
end
width = size(ref_image,2);
height = size(ref_image,1);
% intensity histogram作成
max_value = max(max(ref_image));
histogram = zeros(max_value+1,2);
histogram(:,1) = 0:max_value;
for y = 1:size(ref_image,1)
for x = 1:size(ref_image,2)
histogram(ref_image(y,x)+1,2) = histogram(ref_image(y,x)+1,2) + 1;
end
end
% intensity windowをmin_intとmax_intをintensity histogramの上下0.3%になるように設定
min_adjust = 0;
n = 0;
while n < 0.003 * width * height
min_adjust = min_adjust + 1;
n = sum(histogram(1:min_adjust+1, 2));
end
rows = size(histogram,1);
max_adjust = rows - 1;
m = 0;
while m < 0.003 * width * height
max_adjust = max_adjust - 1;
m = sum(histogram(max_adjust+1:rows, 2));
end
% intensityを最大255,最小0になるように補正
AdjustedImage = uint8((Image - min_adjust) / (max_adjust - min_adjust) * 255);
end
% -----------------------------------------------------------------------
2.表示する
明るさの範囲を引数で指定する場合
figure, imshow(image, [low, high])
上記のサンプルコードの関数を利用する場合
figure, imshow(Adjust(image))
3.アニメーション表示
同じFigureでimshow関数を連続して使うことでアニメーション表示することができる。
imshow, drawnow, pause関数を用いる。
動画として出力するにはim2frame関数を使う。
im2frame関数を使うとなぜか上下が反転して格納されるので、flipdim関数で修正する。
サンプルコード。FRETImageProcess2クラス の Movie関数の中身。
アニメーション表示をしてムービーフレーム作成
% -----------------------------------------------------------------------
% ImageCellArray変数にセル配列として格納された複数の画像をアニメーション表示
figure;
for i = 1 : length(ImageCellArray)
% 1枚の画像を取得、doubleに型変換
Image = double(ImageCellArray{i});
% 画像を自動補正(上のサンプルコードのAdjust関数を使用)
adjusted_image = Adjust(Image);
% 描画
imshow(adjusted_image);
% 画像更新
drawnow;
% ムービーフレームとして格納(フレームにすると上下が反転するためflipdimで修正)
Frames(i) = im2frame(flipdim(adjusted_image, 1), colormap);
% インターバル
pause(interval);
end
% -----------------------------------------------------------------------
作成したムービーフレームはmovie関数を使うことで再生できる。
movie(Frames);
4.画像ファイル出力
画像をファイルとして出力するにはimwrite関数を使う。
bmp、jpgなど各種形式のファイルに出力できる。
image変数に格納された画像を16bit無圧縮Tiffファイルに出力する場合
imwrite(uint16(image),'filename.tif','tif','Compression','none');
一つのTiffファイルに複数の画像を含めたい場合は、WriteModeオプションでappendと指定する
(Metamorphで開くとStackとして開かれる)
for t = 1:timepoints
imwrite(uint16(images{t}),'filename.tif','tif','Compression','none','WriteMode','append');
end
このとき、すでにfilename.tifが存在しているときは、既存のfilename.tifは上書きされずに
images{t}の画像が追加されていくので注意。
上書きしたい時は既存のfilename.tifを消しておく。
5.動画ファイル出力
3.のサンプルコードで作成したムービーフレームは、
movie2avi関数を使うとaviファイルとして出力することができる。
movie2avi(Frames, filename, 'fps', 10)
このコードは10fpsの動画として出力する。