前回は、画像の数値要素型や色空間の変換関数など多数あり、とのことでそれらの相関図的なものを描いて終わっておりました。まあ、見た通りといえばその通りみたいなのですが、それでも細々した注意点などあり。それに大体、どういう画像形式なんだか調べるにはどしたら良いの?画像処理素人老人には戸惑うことばかりっす。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。
以下によって変数imに読み込むことのできる「いつものお猿様」のお顔を題材とさせていただいております。
im = imread(fullpath(getIPCVpath() + "/images/baboon.png"));
画像のサイズと要素の表現形式
画像といってもScilab上の通常の「変数型」の配列に格納されております。変数型を確かめるのにまず使用できるのは type() 関数です。
上記のように、type()関数にお猿様画像の配列を渡すと、返ってくるのは黄色でマーカを引いた「8」です。この8という数字は、整数型の配列であることを示しているみたいです。プログラムで処理するときは、処理しやすいですが、人間、とくにお惚け老人は「8」と言われてもピンときませぬ。そのときは、typeof()関数使う方がよろしいかと思います。上の赤丸みたいに uint8 とか構成要素の型を人間可読な文字列で返してくれます。
さて画像が詰まった配列の type を確認すると返ってくるのは主に以下の2つではないかと思われます。
-
- 8、整数行列
- 1、実数または複素数の定数行列
RGBカラー画像でも、グレイスケール白黒画像でも主に使われているのは8です。実数型(倍精度)の行列を使った場合は、1が返ってきますがここでミソなのは「定数行列」というくだりです。typeof() 関数にかけてみると返ってくる文字列は以下のようです。
constant
知らないとちょっとギョッとします。
画像サイズの方は、普通に size()関数でその大きさを取得できます。行数、列数の順番です。白黒画像(およびインデックスカラー)の場合は行数、列数の2次元ですが、通常のカラー画像の場合は行数、列数に加えて深さ3が末尾にくる3次元の配列としてサイズが返ってきます。
よってあるグレースケール画像 imG 512×512サイズに対して以下のようにすると縦方向が半分(上半分)の画像が返ってきます。
imG(1:256, 1:512);
imshow()で表示できる形式には制限あり
helpファイルをみてみると、サポートしている画像形式はなんでもimshow()関数で表示可能、みたいに思えるのですが、実際にやってみると制限はありみたいです。
-
- カラー画像の基本はRGB形式、数値はuint8。
- 白黒画像の数値はuint8が基本だが、倍精度型などでもOK。
ヒックリ返すと以下のようです。
-
- RGB以外のカラー画像形式でも、imshow()はRGBだと思って表示してしまうので変な色?で表示される
- 複数プレーン使用(通常3プレーン)のカラー画像でuint8以外を与えると表示されない
まずはRGB以外のカラー画像形式(hsv)をimshow()に与えてみます。
異様な色のお猿様になってしまいました。
RGBなんだか、HSVなんだか色空間は各自で管理しろよ。
ということなんだと思います。
通常のRGBカラーはuint8ですが、これをint16とかに変換するのは簡単です。
im2imt16関数により、uint8範囲の0から255の数値は、int16範囲の-32768から32767までの数値に変換されます。上記のように行列としてのサイズは同じです。しかしimshow()はこれを受け付けられないようで表示は真っ白でした。
試してみると白黒画像については倍精度実数などを渡しても表示できるようです。ここで白黒の、しかし倍精度実数値の「チェッカーフラグ」風画像を作製してくれる
imcreatechecker
という関数があったので、imshowしてみました。この関数はクセつよで、結果は必ず ans 「だけ」に格納されるみたいです。値は0.0 と 1.0がつまってます。
imshow()は単純なRGBだけでなく、インデックスカラーは正常にサポートしてくれているようです。こんな感じ。
上記のインデックスカラー化された画像が以下に。フツーのRGBカラーと見分けがつかんぞなもし。
多少クセ強なところがあるけど、まあ、使えそうか。ホントか?