前回は、画像の解析などに使えそうな関数どもを手習ひしてみました。今回は画像のある形式から他の形式へと変換する変換関数どもについて調べてみます。これがまた、いろいろあるんだ。ざっくり言うとRGBとかHSVとか「色空間」の間の変換と、符号無8ビットとかダブルとか数値表現の間の変換に分かれるみたい。覚えきれませぬ。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。
Image Types and Color Space Conversions
今回はツールボックスの中の Image Types and Color Space Conversions というカテゴリに属する関数どもです。rgb2gray関数のように既にお世話になっているものもあり、使ってみたことのないものもあります。各種変換がほぼ自由自在(一部は非対称だけれども)にできるとあって変換関数の数が多いです。今回はその関係を図にするだけで力つきました。勝手な「おまとめ」はこんな感じ。関数は変換元と変換先を結ぶ「矢印」であらわしとります。
中央上にCOLORとタイトルされている大族が、色付きの画像どもです。そこにはお馴染みさんのRGB「色空間」以外に、「色のプロ」の人が使いそうなHSVとか、Mpegなどの動画でお馴染み(今は昔か?)なYCBCR、アナログテレビでお世話になったNTSCなど色空間が鎮座しております。それら間での変換は中心に座るRGBを介してほぼほぼ対称に変換可能。
COLORの箱の左の方に黄緑色のフォルダがあり、自分から自分に向かって6種類ほどの関数が丸まってます。これは、RGBといってもR、G、Bの各要素を表現するのに、ダブル型の浮動小数から8ビット符号無数まで数値表現がいろいろありえるので、それらの表現形式間の変換関数もあるぞ、とうことであります。
一方、右下のMONOとタイトルしてみた大き目の箱は、モノクローム(白黒)画像の箱であります。白黒画像といってもグレースケールの白黒画像Grayと、2値で白と黒しかないBWの2つに大きくわかれます。その真ん中に緑の箱があるのは、Gray画像の全体をみて、この辺に2値化のスレッショルドを置くとよいんじゃね、という値を計算してくれるimgraythresh関数があるためです。これをつかってグレースケールを変換してもよし、何か他の基準でバッサリやってもよしと。また、白黒画像でもダブル型の浮動小数から8ビット符号無数まで数値表現がいろいろあり、それらの変換関数は有効。
左下の箱は、画像というより数値データ的なMatrix(行列)から画像化への橋渡しのための関数どもです。ここでuint8 と double と箱があるのは、この2つについては、入力Matrixのドットを正規化(double型なら0.0から1.0の間、uint8型なら0から255)する専用関数があるためです。それ以外のときは勝手にやれ、ということだね、きっと。どれも行先はグレースケール画像です。
一方、左上にあるGraphicsという箱は、Scilabのプロットウインドウのようなグラフィックオブジェクトです。折角なのでそれを「画像」として取り込んで処理できるみたいです。行先はカラーのRGB画像か、2値のBW画像みたいっす。
上記の「相関図」を描くのに手動でGraphvizのスクリプトを書いたので貼り付けておきます。
digraph PID_control { graph [fontsize=12, fontname = "Meiryo"]; node [shape=box, fontsize=12, fontname = "Meiryo", style=filled, fillcolor=aqua]; edge [fontname = "Meiryo"]; rankdir=LR; subgraph cluster_color_img { label ="COLOR" colorimg [label="all color images", shape=folder, fillcolor=greenyellow]; hsvimg [label="HSV"]; rgbimg [label="RGB"]; idximg [label="IDX"]; labimg [label="LAB"]; ntscimg [label="NTSC"]; ycbcrimg [label="YCBCR"]; hsvimg -> rgbimg [label="hsv2rgb,hsv2rgb2"]; idximg -> rgbimg [label="ind2rgb"]; ntscimg -> rgbimg [label="ntsc2rgb"]; ycbcrimg -> rgbimg [label="ycbcr2rgb"]; rgbimg -> hsvimg [label="rgb2hsv"]; rgbimg -> idximg [label="rgb2ind"]; rgbimg -> labimg [label="rgb2lab"]; rgbimg -> ntscimg [label="rgb2ntsc"]; rgbimg -> ycbcrimg [label="rgb2ycrcb"]; colorimg -> colorimg [label="im2double"]; colorimg -> colorimg [label="im2int16"]; colorimg -> colorimg [label="im2int32"]; colorimg -> colorimg [label="im2int8"]; colorimg -> colorimg [label="im2uint16"]; colorimg -> colorimg [label="im2uint8"]; } subgraph cluster_mono_img { label ="MONO"; //monoimg [label="all mono images", shape=folder]; thr [label="Otsu's Global threshold", fillcolor=green]; gryimg [label="Gray"]; bwimg [label="BW"]; gryimg -> bwimg [label="im2bw"]; gryimg -> thr [label="imgraythresh"]; gryimg -> gryimg [label="im2double"]; gryimg -> gryimg [label="im2int16"]; gryimg -> gryimg [label="im2int32"]; gryimg -> gryimg [label="im2int8"]; gryimg -> gryimg [label="im2uint16"]; gryimg -> gryimg [label="im2uint8"]; thr -> bwimg [style=dashed]; } subgraph cluster_matrix { label ="Matrix"; matrix [label="Matrix", fillcolor=greenyellow]; dbl [label="double"]; u8 [label="uint8"]; matrix -> dbl [label="imnorm"]; matrix -> u8 [label="imnorm"]; } subgraph cluster_graphics { label ="Graphics"; gdat [label="Graphics"]; } rgbimg -> gryimg [label="rgb2gray"]; matrix -> gryimg [label="mat2gray"]; dbl -> gryimg [label="mat2gray"]; u8 -> gryimg [label="mat2gray"]; gdat -> rgbimg [label="xm2im"]; gdat -> bwimg [label="xm2im"]; colorimg -> bwimg [label="im2bw"]; }
お惚け老人のやったことなどで、落ち漏れ、誤記などあるかも知れませんで。