1995年前後の画像処理

NHKで再放送された（デジタルリマスター版）プロジェクトX「<a href="https://www4.nhk.or.jp/P6884/x/2021-08-31/44/21066/2860188/">男たちの復活戦 デジタルカメラに賭ける</a>」を見た。カシオの技術者たちが、<a href="https://ja.wikipedia.org/wiki/電子スチルビデオカメラ">アナログスチルカメラ</a>の大失敗を乗り越えて <a href="https://ja.wikipedia.org/wiki/カシオ_QV-10">QV-10</a> を開発・発売するまでの話。パソコンにデータを取り込めるようにすることで魅力がより増して大売れ、みたいな話に感心しつつ、ふと、「そういえば自分もそのころは、当然のようにデータを計算機に取り込んで画像処理してた」みたいなことも思ったので、当時の画像処理がどんな感じだったのか、誰も読まないだろう昔話などをしてみる。

簡単に自分のプロフィールを書いておく。小学校時代にパソコン（<a href="https://ja.wikipedia.org/wiki/ベーシックマスター">日立ベーシックマスター</a>とか）に触れ、中学時代にはポケコンの BASIC 等でプログラミング。しかしこのころはむしろアマチュア無線や電子工作が中心だった。高校時代に <a href="https://ja.wikipedia.org/wiki/プログラミング言語C">K&R</a> でC言語を習得し、レイトレーシングで生成したカラー画像をディザリングで<a href="http://www.pc-9800.net/db_98/data/pc-98xa.htm">16色表示のディスプレイ</a>に表示したり。1990年に大学入学、ソフトハウス（<a href="https://jibun.atmarkit.co.jp/ljibun01/rensai/genesis/229/01.html">ダイナウェア</a>）でプログラマーのバイトに精を出す。1993年から画像処理（３次元計測・コンピュータビジョン）関係の研究室に。がっつり画像処理をするようになって今に至る。

##1990年代前半のデジタル画像処理（ハードウェア）

1990年頃のパソコンは、そのままではフルカラー表示ができないものが多かった。これは主にVRAM搭載量の不足によるもので、<a href="https://ja.wikipedia.org/wiki/PC-9800シリーズ">PC-9801</a>やライバル機種（日立B16/32, <a href="https://ja.wikipedia.org/wiki/FMRシリーズ">富士通FMR</a>等）のビジネス向けの機種は8〜16色表示が当たり前だった。漢字を含むテキストを軽快に表示するため漢字ROMのフォントを直接画面に表示するハードウェアを搭載したものが多く、ビットマップ画像の表示はビジネス界では余技のようにみなされていたとも言える（バイト先のダイナウェアではフルビットマップ表示・マウス前提 (GUI) のアプリ群を独自開発のウィンドウシステムに搭載していたが）。一部のホビー向け機種では1980年代の終わり頃から、より多い色数が表示できたものの（<a href="https://ja.wikipedia.org/wiki/X68000">X68000</a>:64K色、<a href="https://ja.wikipedia.org/wiki/FM_TOWNS">FM-TOWNS</a>:32K色）、メインメモリや二次記憶の容量の問題で、同じ要素を繰り返し貼り付けるゲームグラフィックスや簡単な CG では使われても、自然画像（写真）が扱われることはあまりなかったと思う。

PC-9801でも<a href="https://www.sp3.com/kaishagaiyo.htm">社外品のグラフィックカード</a>を搭載すれば24ビットフルカラー表示も可能だったが、カードが20万円ほどするなど、一部の先進的なプロイラストレーターぐらいしか使っていない状況。それが次第に1995年の Windows95 発売の前後に<a href="https://ja.wikipedia.org/wiki/PC/AT互換機">PC/AT互換機</a>、SVGA/XGA の普及と相まって多色化・高解像度化・低価格化したが、 Window95 のころは画面モードが256色や64K色（いわゆる high-color) までの機種が多かったと記憶する。フルカラーは遅くなるので敬遠されていた。

では研究室ではどうだったか。自分が配属された研究室では主に <a href="https://ja.wikipedia.org/wiki/アポロコンピュータ">Apollo Computer</a> を使用しており、グラフィックス性能もいろいろだったが、それらのワークステーションにも（解像度は高かったが）フルカラー表示できるものはほとんどなかった。そこに、こんなマシンどうやって調達したのか？寄付を受けたと聞いたような気もするが、当時最高性能のワークステーション、<a href="https://ascii.jp/elem/000/001/550/1550550/3/">Apollo DN10000VS</a> というデスクサイド型の機種があった。こいつは "VS" （たぶん visualization system かなんかの略）と付いているだけあってフルカラー表示やはおろか、3Dグラフィックスのハードウェアアクセラレーションもできた。<a href="https://www.researchgate.net/publication/220720249_The_rendering_architecture_of_the_DN10000VS">テクスチャマッピングやグローシェーディングも現在使用されている線形補間だけでなく２次関数補間が出来る</a>という凝りようである。<a href="https://ascii.jp/elem/000/001/550/1550550/2/">PRISM という当時最先端の VLIW RISC マルチ CPU</a>で、数千万円クラスのマシンだったと思う。

しかしその計算機でも直接画像が入力できるかというとそんなことはなく、VME バス拡張ボックス中に、これもかなり高価なキャプチャボード（一辺 30cm ほどの大きなボード）を指して、それの IO ポートを直接叩いてアナログカメラからの画像を取り込んでいた。当然、動画の取り込みは無理（１枚取り込むのに１フレーム以上かかるため）。解像度はアナログということもあって 512x512画素ぐらいで、カラー信号 (<a href="https://ja.wikipedia.org/wiki/NTSC">NTSC</a>) は画質が落ちるので特段の必要がない限りモノクロカメラを使って研究していた。どうしてもカラーが必要なときは、３板式（3CCD式）カメラからR/G/Bの各画像がそれぞれ別の同軸ケーブルに出る、コンポーネント信号を取り込むのが望ましいとされていた。またインターレースの影響があるので動く物体を処理するときにはさらに解像度を落とす場合が多かった。

##1990年代前半のデジタル画像処理（ソフトウェア）

上記のようなことで、当時は（今から見れば）どうにかこうにか画像が計算機に入って処理できるといったレベルだった。先人はドラムスキャナとかでハードコピー（写真の引き伸ばしプリント）から取り込むのが主流だったそうで、それに比べればずっとリアルタイムに近づいたのではあるが。画像処理のレベルは CPU の速度ももちろんだが、メモリや二次記憶装置の容量にも大きく影響を受けていた。1990年代初頭のパソコンは x86 系の16ビット命令で動いていて、メモリは数 MB ほど扱えるものの、「<a href="https://www.wdic.org/w/SCI/64Kバイトの壁">セグメントの壁</a>」・・要するにポインタの長さが16ビットしかなく、64kBを超えるメモリを扱うのが面倒だった。大きな画像を処理するには64kBに収まるように細切れに処理する必要があり、またメインメモリには何枚も画像が入らないので、処理するごとにHDDに書き戻すようなことも必要だった。CPUの進化にOSが追いついていないようなところがあった。

ソフトハウスでのアルバイトでも、そんな常識の中で働いていたところ、研究室のWSを使って「これはすごい！」と思ったのが画像処理プログラミングの楽さ。WS は最初から32ビットアドレッシングなので、`unsigned char image[512][512];` などと無邪気に書いて動くのが嬉しく、研究室配属は４月だったが、夏頃にはそれなりに結果が出た。「学会発表しない？」と言われ、8月頭には１枚だけの原稿を書き、11月に発表。そこで賞をもらい、なにを勘違いしたのか研究者への道を歩むきっかけになってしまった。

論文作成などの事務処理ではこのころ、図（グラフや模式図）はパソコン中で処理するが、写真はフィルムカメラで撮って、論文に糊で貼ることが多く、実際に自分の修論（1995年）はそうなっている。修士課程当時 (1993-95年）の同級生に絵画の分析をしている人がいて、その人はある作家の絵画をひたすらスキャナで取り込んで処理していたが、データが大きいので特別に 1GB の HDD を買い与えられ、<a href="https://ja.wikipedia.org/wiki/Macintosh_Quadra_700"> Macintosh Quadra 700</a>等で処理をしていた。その結果を論文に貼るのに、今のように写真が満足行く画質で印刷できるA4プリンタはないので、ハガキサイズぐらいできれいに印刷できる昇華熱転写プリンタで印刷したものを切り取って論文に貼っていたように思う。1995年ごろ学科共通設備としてA4サイズで写真画質の印刷ができる、<a href="https://ci.nii.ac.jp/naid/110003194944/">富士写真フイルム Pictrography 3000</a> が導入され使用できたが、なかなか論文のテキストとの同居しての印刷は難しい状況だった。

閑話休題。というわけで WS にジャブジャブと画像を読み込んで画像処理が可能に・・・ということかといったらそうは問屋は卸さず、あまり多数の画像はメモリに読み込めないので、やはり数枚読み込んで処理をしたらHDDに戻す、というのが普通だった。当時は対象物体を回転させた画像から３次元形状を復元するような研究をしていて、512x512画素の画像を500枚撮影して使用していたが、これらを全部メモリに読むのはもちろんのこと、HDDに格納するのも憚られるような状況だった。なので、当時はまずその500枚の画像を光磁気ビデオディスクレコーダー（映像・放送機器。直径40cmぐらいの巨大なディスクを使う）に撮影・記録し、そのレコーダーをシリアルポート制御でコマ送りしながら取り込みつつ処理をする（処理が終わったら元画像は捨てる）、というようなトリッキーなことをしていた。


##シリコングラフィックス(SGI)の衝撃

1995年に提出した修士論文のころまでは主に Apollo のワークステーションで研究をしていた。Apollo は今考えてもとても先進的な計算機で、<a href="https://ja.wikipedia.org/wiki/Domain/OS">ネットワークで接続した多数の WS がまるで一個の計算機に見えるような機能もあり優れていた</a>のだけれども、HPに買収されてからは徐々に表舞台から消えていった。他の研究室はたいてい、流行りの <a href="https://ja.wikipedia.org/wiki/サン・マイクロシステムズ">Sun Microsystems</a> のワークステーション（初期は 68系だったが、<a href="https://ja.wikipedia.org/wiki/SPARC">SPARC</a> 搭載機種が出てさらに人気が上がった）を使っていたが、当時の助手の先生（<a href="https://ja.wikipedia.org/wiki/ARToolKit">ARToolKit</a> を開発したあのK先生だ）の趣味だったのかなんなのか、そっちには行かず、 HP の <a href="https://ja.wikipedia.org/wiki/PA-RISC">PA-RISC</a> のマシンとかが導入されていた。そこに入ってきたのが<a href="https://ja.wikipedia.org/wiki/シリコングラフィックス">シリコングラフィックス (SGI)</a> のワークステーションである。よく知られているように SGI の WS はグラフィックアクセラレーターを搭載しており、さらに <a href="https://ja.wikipedia.org/wiki/R3000">MIPS R3000</a> などの RISC CPU を搭載していた点もよろしかった。

当時は Apollo にしろ SGI にしろ、WS を買えば棚に並べると壮観なぐらい膨大な資料（紙）が付属していた。もちろん飾りではなく、それを見ればちゃんとプログラミングが出来るのがとても助かった（要するに今みたいに本屋で書籍を探したり、webで断片的な情報を集めなくてもよかった）。SGI はグラフィックアクセラレーターの性能もさることながら、その API である <a href="https://en.wikipedia.org/wiki/IRIS_GL">GL (IrisGL)</a> がすごかった。IrisGL の後継の OpenGL は単体では使えず、ウィンドウを開いたりするのに補助ライブラリが必要だが、IrisGL ではそんなことはないので、本当に簡単にリアルタイムグラフィックスを始められた。自前の座標計算・光源計算も不要だし、Zバッファがあるので隠面消去等も考えずに、ポリゴンの頂点座標を投げていけば絵が出るのだから当然だ。

1995年ごろは、<a href="https://www.jstage.jst.go.jp/article/jrsj1983/13/3/13_3_315/_article/-char/ja/">リアルタイム距離画像センサ</a>（後のKinectのようにフレームレートで距離画像が測れるセンサ）を使って物体の動きを解析する研究をしており、その計測結果を表示するのにもとても好都合だったので、センサは Apollo に接続されているけれども、そのデータを SGI へネットワークで飛ばしてそっちで表示するというようなことをやっていた。DN10000VS はグラフィックス性能も非常に高かったけれども、どちらかというと完成した CAD モデルをグリグリ回して表示するような用途向けに API が作られていて、刻々と形状が変わるものは表示しづらい（もしくはやり方がわからなかった）。その点、SGI では一晩でリアルタイム変形する３次元表示が書けて、「こりゃすげえ」みたいな衝撃があった。そういえば当時アルバイトに行っていたダイナウェアは建築パースソフト（ダイナパース）を作っていて、これは最終レンダリングとしてパース図を出せるのが売りだった（プロッタ等で精密に描けるという美点もあった）けれども、レンダリングに数十秒を要することが多かった。それが、どこかから借りてきた SGI で腕利きのプログラマが数日プログラミングしたら、同じパース図がグリグリ回っていて、社員・アルバイト一同、それを見て新しい時代の到来（と、高いマシンの凄さ）を感じた・・ということもあった。

CG に話が脱線したが、SGI はグラフィックス志向ということもあってカラー表示に強く（といっても上位機種でなければ24ビットフルカラーが表示できなかった）、また<a href="http://www.sgidepot.co.uk/siriusvideo.html">メーカ純正のキャプチャカード</a>が使用できた。といってもリアルタイム画像処理はまだなかなかきびしく、どちらかというとカメラ画像に CG をオーバーレイ表示するのが主目的のようなオプションだった（3D CG アバターを AR 表示・・ができればいいんだけど、主には、選挙速報の放送でスタジオに立体的なグラフを生やす、みたいな合成映像のために使われたのだと思う）。

1997年のD論までは主にこれらの SGI WS (<a href="https://en.wikipedia.org/wiki/SGI_Indigo²_and_Challenge_M">Indigo² Extreme</a>, Indy, <a href="https://en.wikipedia.org/wiki/SGI_O2">O2</a>など）を使って研究した。また、自分の研究にはあまり使用しなかったが、当時学科が獲得した大型予算で <a href="https://ja.wikipedia.org/wiki/SGI_Onyx">SGI PowerOnyx (R8000) + Reality Engine2</a> が導入された。距離センサで得た形状を 3D CG で表示し、そのＺバッファ（デプスバッファ）値を読み出して処理に使うことで高速に物体の運動を追跡するような研究で博士号を取ったが、思えば（GPGPU とまでは言わないが）画像処理に GPU を使った研究の走りだったと思う。

##1990年代終盤

京都大学に２年間ポスドクに行ったが、そこはぜんぜん違うワールドだった。メインは Sun Microsystems の WS で、そこに計算機好きの助教授 W 先生の趣味で？ <a href="https://ja.wikipedia.org/wiki/Alpha_21164">DEC Alpha 21164</a>とかの高速な計算機が導入されて使われていた。しかしグラフィックスに興味のある方が少なかったためか、そちら方面はあまりなく、CPU集約型。ドクターコースまでは、実験は WS、論文執筆は Mac で、D論は Aldus PageMaker で書いたように記憶している。それが京大では基本的に皆 PC に FreeBSD を入れ、論文も OHP も LaTeX + InkScape で作るといった環境だった。TeX は学部生時代からレポート作成などに使っていたので面食らいはしなかったが、Mac は一切ないといってもいいような環境だった。

このころから一般向けの PC (<a href="https://ja.wikipedia.org/wiki/PC/AT互換機">PC/AT互換機</a>）が画像処理の研究にもよく使われるようになってきた。 CPU の高速化やメモリの大容量化も大きいが、それだけでなく FreeBSD / Linux などの UNIX 系 OS が実用的になり、画像処理プログラミングの容易化だけでなく、研究室のワークフロー（サーバでアカウントやホームディレクトリを一元管理）に一体化させやすくなったことが大きい。"PCクラスタ" が流行ったのもこの頃だと思う。<a href="https://ja.wikipedia.org/wiki/InfiniBand">InfiniBand</a>等のネットワークも使われていた。

また 1997-1999年ともなると、急速にデジタルカメラやフルカラー画像を扱うことが増えた。研究室で購入したのは、オリンパスの <a href="https://www.olympus.co.jp/technology/museum/camera/products/digital-sl/c-1400l/?page=technology_museum">CAMEDIA C-1400L</a> だったか？今調べると141万画素のカメラだが、少し前のデジカメから格段に画質が向上し、論文に貼る装置外観などの画像をデジカメで撮ることも増えてきた。同じく 1997年頃にはコンシューマ向けインクジェットプリンタ（例えば、エプソンの<a href="https://www.epson.jp/ms/1996_11.htm">カラリオ PM-700C</a>）の画質も多色インクで向上し、デジカメ・PC・プリンタの三位一体で自然画像を計算機で扱うことが急速に広く一般化した。pdf も徐々に普及して（自分の修論(1995)・D論(1997)は、ハードコピーからスキャンした pdf しかないが）、論文や国際会議の投稿も紙の郵送から pdf の送付へと置き換わってきた。

しかし研究はどうだったかというと、リアルタイムにカメラからデジタル画像を入力することはまだ一般的ではなかった。カメラは相変わらず NTSC 方式で、それをアナログキャプチャカードで取り込むのが一般的。つまりセンサの各画素に１画素１画素が対応したきれいな画像はなかなか得られない時代だった。同じ 512x512画素でも、その画質の差は歴然としていて、それは特にカラー画像では顕著だった。非常に高価なキャプチャカードを用いていた時代は前述のようにRGBコンポーネント信号（RGBバラバラに１本ずつの信号）で取り込んでいたことがあったが、安価な PC 用キャプチャカードではS端子を用いることが多く、むしろ画質的には低下していたかもしれない。この頃まではまだ撮像素子も原色フィルタ (RGB) よりも補色フィルタ (CMY, CMYG) を用いたものが多かった。

##2000年代初頭

1999年4月、京大での２年間の武者修行？を終えて古巣の研究室に助手として戻った。そのころから研究にワークステーションでなく、PCをメインに使うようになってきた。グラフィックスカードも <a href="https://ja.wikipedia.org/wiki/S3_Graphics">S3 Graphics</a> / <a href="https://ja.wikipedia.org/wiki/3dfx">3dfx Voodoo</a> を経て、NVIDIA <a href="https://ja.wikipedia.org/wiki/NVIDIA_RIVA">RIVA TNT</a> とか <a href="https://ja.wikipedia.org/wiki/NVIDIA_GeForce">GeForce256</a>の「グラボ」が安価で出回るようになり、研究に用いる計算機のコストがぐっと圧縮された。学生時代は大きな科研費が当たると SGI の WS が１台増える・・というような状況で、財政状況が研究環境に直結していたと思われるが、この頃からある意味で誰でも画像処理の研究ができるようになってきた。一般ユーザレベル、事務処理でも（今から見ると、<a href="https://ja.wikipedia.org/wiki/Mac_OS_9">ちょっと迷走していた MacOS X 前の Mac</a> に対し） Windows 2000 のような安定な OS に、100万画素（メガピクセル）を超えるデジカメが普及し、いっきに写真をデジタルで撮ることが普通になってきた時代である。

ただし画像処理（コンピュータビジョン分野）では依然としてアナログキャプチャカードがまだ使われており、一部でIEEE1394接続のデジタルカメラ（例えば、ソニー <a href="https://pulse-denshi.co.jp/eizo/kiki117.html">DFW-VL500</a>）を使っていたような状況だったように記憶する。2000年代初頭までの自分の論文を見ると、<a href="https://www.sony.com/ja/SonyInfo/News/Press_Archive/199603/96B-040/">ソニーの首振りカメラ EVI-G20</a> を使った研究がいくつかあり、これはNTSCアナログ出力（コンポジットまたはS端子）だった。当時の USB はまだ遅く、リアルタイムに映像を流す用途にはほとんど使われていなかったように記憶する。なので映像のデジタル伝送の主役は IEEE1394 で、家電界隈では DV 端子や i.Link と言われ、映像が通せるデジタルインタフェースとしては初めて広く普及したものだと思う。ただし多くはダビングやPCでの映像編集用で、リアルタイムの画像処理に使うのは一筋縄では行かなかった。

その後、PointGray Research 等を始めとして多数の会社が「全画素読み出し」のデジタル方式FAカメラを発売するようになり、やっと現在のようにセンサの１個１個の画素値がそのまま配列上の各値に対応するような状況が実現されてきた。当然のごとく計算機も高性能化・大容量化し、なんの遠慮もなく動画をそのまま HDD に入れるようになり現在に至る。

##画像フォーマットについて

今当然のように使われる JPEG や MPEG も、上記のような歴史に呼応するように発展普及してきた。<a href="https://ja.wikipedia.org/wiki/JPEG">JPEG</a> は1992年リリースであるが、当時はあまり知られていなかった。これもやはりバイト先で「JPEG ってやつがあって、試してみたんだけど、画像データがめっちゃ小さくなるんよ」「すごいなこれ、どうやって圧縮してるの？」「ちょっと画質が落ちるらしい」「なんやそれ、ずるいな」みたいな会話があったような記憶がある。1980年代〜1990年代前半までは圧縮というと zip / LHarc のような可逆圧縮のことで、非可逆圧縮については理解も利用も進んでいなかった。たしか Windows95 もそのままでは JPEG は表示すら出来なかったように思うし、大きな画像を貼ると不評だったウェブページでも GIF 画像が多かった。1995年ごろまでのデジカメ（<a href="https://ja.wikipedia.org/wiki/Apple_QuickTake">Apple QuickTake 100</a> や CASIO QV-10を含む）も保存形式は JPEG ではなかった。

動画も <a href="https://ja.wikipedia.org/wiki/Motion_JPEG">Motion JPEG</a> や MPEG-1 がよく使われていた。MPEG 圧縮にはフレーム間で対応付けをする必要があり、この計算量・消費電力が大きいためにデジカメでは当初あまり使われていなかった。また <a href="https://ja.wikipedia.org/wiki/MPEG-2">MPEG-2</a> はライセンスの関係でライブラリなどに乏しく、画像処理プログラミングで扱うには敷居が高いところがあった。今のようにさっと（ほとんどなにも考えなくても）JPEG や MP4 が読み込めるようになったのは、そんなに昔のことではない。

##おわりに

今はもうすっかり当たり前に、静止画はおろか、ネットワークで動画を垂れ流しにするのも当たり前の時代。「でもちょっと前はこんなの、とても出来なかったんだよ」と2000年頃の話をすると、若い子には「2000年なんて大昔」扱い。しかし彼らもそのうち気づくと思う。10年、20年なんてあっという間だということを。

とはいえ、まあこの記事は同年代の人が「あ〜　そんなの、あったあった」と懐かしむものでしょう。

関連する話題としてネットワークの進展（特に家庭向け）などもあるが、研究室レベルでは1990年代初頭から Ethernet が使われていたこともあり、ここでは割愛した。