【MATLAB】画像データの行列を指定のカラーマップで保存する

MATLAB

 サイズが(N,M)の画像データの行列をM×Npxの画像データとして指定のカラーマップで保存するには、以下のようにする。

image_path = "hoge.tif";
savename = "hoge.png";
cmap = parula;
I_gray = mat2gray(I); % 0~1にスケール
I_uint8 = im2uint8(I_gray); % 0~255にスケール
I_color = ind2rgb(I_uint8, cmap); % 指定したカラーマップでRGB形式に変換
imwrite(I_color, savename); % 画像の保存

コードのコメントにも書いてあるが、

①mat2gray関数で行列を0~1にスケール
②im2uint8関数(もしくはim2uint16)で0~255にスケール
③ind2rgb関数で指定したカラーマップのRGB形式に変換
④imwrite関数で保存する。

参考:Save an intensity image created with imagesc with true resolution – MATLAB Answers – MATLAB Central (mathworks.com)

以下は自分のメモ

tif画像などを読み込み、何らかの計算を行ったものをよくimagesc関数で表示している。

ランダムな数値の行列をimagescで出力したもの

 この画像を保存する場合、ツールバーのアイコンまたはメニューから保存したり、画像にカーソルを合わせると出てくるエクスポートのアイコンから保存することができる。ただし、この機能で保存した画像は余白がついてしまうし、そもそも解像度もfigureのサイズに依存してしまう。ピクセルのアスペクト比も1ではない。imshow関数を使うことでアスペクト比の問題は解決するが、解像度や余白の問題は解決できない。解像度はprint関数を使うことで、余白は調べると色々出てきたが、そもそもの問題として私は1000×1000の行列がある場合、1000x1000pxの指定したカラーマップの画像として保存したいのだ。

 適当に日本語で検索するとsaveas関数やprint関数を使う方法ばかりだったので、英語で適当に検索したら上記リンクのMatlab Answerを見つけた。上で紹介したコードはこの記事に書かれているコードをただ分解しているだけ。個人的に勉強になったのはind2rgbで、行列の各要素をカラーマップのインデックスとし、色を割り振っているのが考え方として自分の中になかった。考えてみるとカラーマップとはそういうものだしおかしくないけど、あまりrgbとかカラーマップとか考えてこなかったので面白かった。いつもよくわからず画像とか保存したり読み込んだりしているので、pngとかjpegとかtifとかの仕様も勉強したい。

コメント

タイトルとURLをコピーしました