Otaku ワールドへようこそ![68]画像の輪郭線を抽出する方法について
── GrowHair ──

投稿:  著者:


写真の上にトレーシングペーパーをかぶせて、上から鉛筆で輪郭線をなぞると、線画に起こすことができますね。これに相当することを、パソコンを使って自動的に行うこともできます。たとえば、アドビシステムズが販売しているおなじみの画像編集ソフトウェア「フォトショップ」を使えば、[フィルタ]→[表現方法]→[輪郭のトレース]メニューでそういう処理ができます。

コンピュータの中で、いったいどんな計算が行われているのかは、利用する側からみれば、立ち入る必要のない領域です。せいぜい、「中の人」が画像を隅から隅まで眺め渡して、せっせとトレースしているんだな、はいはいご苦労さん、ぐらいに思っておけばいいわけです。いわゆるブラックボックスってやつですね。

だけど、ソフトウェアを書く側からみれば、どうやって輪郭線を抽出したらいいかは重要な問題です。このための手法はいくつもあります。実は、私も最近、ひとつ思いつきました。この手法は、一般的によく用いられている「ラプラシアン・ガウシアンのゼロ交差」と呼ばれる手法に比べて、ほんのちょっとだけいいところがあるのではないかと思っています。

なので、今回はその話をしてみたいと思います。まあ、いきなり数式がぞろぞろ出てきては楽しくないかもしれないので、まずはカタい話抜きに画像処理のことを一から説き起こして、ピクニック気分でゴールまでたどり着けたらよいかと思います。



●画像を浮き彫り的に見る

我々人間が写真を眺めるとき、そこに何が写っているとか、背景がどうなっているとか、シーンを瞬時にして理解します。その上で、何らかの感情が呼び起されたり、絵としての面白さを味わおうとする働きが起きたり、いいとか悪いとかきれいとかきたないとか好きとか嫌いとか、判定が下ったりします。しかし、コンピュータで画像を扱う方法について考えるとき、画像を眺めるにも、ふだんとは違った入り方が必要になり、ちょっとしたコツが要ります。画像をある種の立体としてとらえるのです。

立体といっても、ホログラムなどの3D映像のように、写真に写っている対象物の元の立体形状を復元しようというのではないのです。もっと機械的に、白っぽいところは手前に飛び出していて、黒っぽいところは奥に引っ込んでいるように見るのです。浮き彫り的立体像とでも言いましょうか。

単純なことなんですが、これが意外に慣れを要します。人間の脳内では、左右の目から来た平面像から元の立体形状を復元しようとする回路が常に勝手に作動しているようで、このスイッチをわざわざ切って、浮き彫り的な立体像に切り替えて見るということに、なんとなく抵抗感があります。まあ、人間に限らず、猫や猫型ロボットでもそうだとは思いますが。

自分が小さな点になったつもりで、この浮き彫り的立体の世界へ入っていき、歩き回ってみましょう。広い平らなグラウンドに、雪が15センチくらい積もっている光景を想像してみてください。足跡は全然ついていません。今、窓の外が実際にそうなっているという人はラッキーです。ぜひ、外へ出ましょう。

その前に、パンダの写真を用意しておきましょう。パンダでなくてもいいのですが。パンダイルカでもいいし、パンダ犬でもいい。それを片手に眺めながら、頭の中で雪の上にでっかく投影し、黒いところを足で踏み固めていきましょう。パンダの目のまわりの黒は、靴跡のような形にへこみますね。その周辺の白いところは、元の積もった雪のまま触りません。白い領域でも、陰影がついてややグレーがかって見えるところは、少しだけ雪を押し固めます。こうしてできるのが、浮き彫り的立体像です。

2メートルぐらい積もった雪で作ったら、ほんとうに自分が画像の中に入って探検しているようで、楽しいかもしれません。雪がなければ霜柱でもいいかも。雪とか霜柱とか、踏む感触がいいですよね。霜柱もなければ、爪楊枝はいかがでしょうか。ビニールの円筒の中にぎっしり詰まった爪楊枝。手のひらで底を押し上げて、全体を少し浮かせます。そしたら、一部分を上から指で押し込みます。こうして絵が描けます。

爪楊枝もなかなかいい感触です。私なんざ、たま〜に意識がぶっ飛んで、小一時間、表から裏から押し込んで遊んでることがあります。一度、ユニットバスの浴槽ぐらいの広さの枠にびっしりと爪楊枝を詰め込んで、ぎゅうぎゅう押して遊べたら面白かんべえと思います。手形とかギジョッとつけてみたくなりますね。

●実はみんな理解している「微分」

微かに分かる微分、分かった積もりの積分、と言われ、微分・積分は、ただでさえ難しい数学の中でも、最も難解なことのように言われがちです。まあ、そういうところがあるというのも否定しきれませんが(多様体上のストークスの定理なんて、私ゃさっぱり理解できちょらんし)。

だけど、微分という概念そのものがそんなに難しいものかと言えば、意外とそうでもないのです。習わなくたって、みんな最初っから直観的には知っているとも言えます。

坂道をえっちらおっちら上っている自分を想像してみてください。この坂の勾配が、水平に100メートル進んで、垂直に6メートル上がるのに相当するならば、この坂は6%の坂だと言いますね。だけど、それは平均の勾配です。もしかすると、坂の勾配はずっと一定ではなかったということもありえます。たとえば、前半の50メートルは比較的ゆるやかで2メートルしか高度をかせいでいないけど、後半の50メートルがけっこうきつくて4メートルかせいだのだったとしましょう。そうすると、前半は
  2 [m] ÷ 50 [m] = 4%
後半は
  4 [m] ÷ 50 [m] = 8%
だったということになります。

しかし、これもやはり、前半、後半、それぞれの区間の平均の勾配です。区間は、もっと狭めていくことができます。1メートル進んで3センチ上がったというのなら、3%です。10センチ進んで7ミリ上がったというのなら、7%です。

だけど、これとても、やはり2地点の間の平均の勾配です。勾配という概念は、2地点の間に斜めに板を渡さなくても、ある1地点だけで、「この地点での勾配」というものを考えることができると思いませんか? 「そうだ、そうだ」とおっしゃるなら、もう微分が理解できています。それが微分です。

1ミクロン進んで50ナノメートル上がったのなら、勾配は5%だ、というふうに、2地点間の距離をどんどんどんどん限りなく近づけていったとき、平均の勾配の値もあるひとつの値に近づいていきます。それが、その地点、1点における勾配です。すなわち、微分。

一本の丸太ん棒を寝かせて置き、その上に平らな板をのせてシーソーのようにして、左右に片足ずつ乗せて板に乗り、バランスをとってみましょう。横から見ると、丸太ん棒と板とは、1点で接しています。その1点における丸太の勾配が、すなわち板の勾配になっています。板が丸太を微分しているわけですな。

車のスピードメーターが指している、現在のスピード、これも微分です。A地点からB地点までどれだけの時間をかけて到達したかによって、2地点間の平均のスピードが決まるわけですが、スピードメーターの指しているのは、それではなくて、1地点を通過する今、この瞬間のスピードです。これは、まさしく微分です。先ほどの坂道の例で、水平方向を時間に、垂直方向を移動距離に置き換えただけの話です。

つまるところ、微分とは、坂がどれだけ傾いているかを、1地点ごとに求める計算のことなのです。どうです? 微分なんて、もうコンビニみたいに身近に感じられませんか? 微分、積分、いい気分。

●画像を微分すれば輪郭線が取り出せる

さて、これで準備が整いました。先ほどの雪で作った、浮き彫りパンダに戻りましょう。黒領域は踏み固めてあり、白領域は積もったままです。では、その間の境界線はどうなっているでしょう。ほぼ垂直な壁になってますね。つまり、勾配が非常にきつい。だから、画像を微分して、勾配が非常に大きなところを抽出すれば、それが輪郭線になっているというわけです。

ただし、ここで言う「微分」には、ちょっと注釈を加えておく必要があります。浮き彫り画像の中を歩き回るとき、先ほどの坂道の場合と違う点があります。坂道では、道に沿って上るか下るかの方向にしか進めないのに対して、画像では、東西南北斜め、どっちの方向にも進むことができます。そして、どっちへ進むかによって、勾配が変わってきます。

こういう場合に便利な「グラジエント」という概念があります。グラジエントは矢印です。いま、山の中腹に立っているとします。このとき、グラジエントは、坂を最も急峻に上る方向を向きます。矢印の長さは、その方向の勾配を示します。グラジエントの逆向きは、谷へ向かって最も急峻に下る方向を示しています。ところで、等高線に沿って進めば、勾配はゼロです。実は、グラジエントと等高線とは、かならず直角をなすという性質があります。

いま、等高線で描かれた地形図を持っているとします。自分がいる地点に点を打ちます。その地点から、等高線と垂直に、上る方向に矢印を引きます。等高線が密集しているところなら勾配がきついので長く、まばらなら緩やかなので短く引きます。この矢印がグラジエントです。

画像の輪郭を抽出するには、各点でグラジエントの長さを求め、これが大きいところを抽出すればよい、ということになります。フォトショップでは、[フィルタ]→[表現手法]→[輪郭抽出]メニューを選ぶと、どうやらこの方法で抽出したと思しき輪郭線が表示されます。

この方法、実はあんまりうまくない点があります。輪郭線がぼやけていると、太く抽出されます。闇夜に黒牛とか雪に白うさぎとか、輪郭線がはっきりしないと、途切れ途切れになったりします。画像のトレースとしては、あまり美しくないのです。

●出っ張りとへこみの間を追跡する

この問題点に対処するために、「ラプラシアンのゼロ交差」という手法が考案されています。ラプラシアンは、簡単に言うと、自分のいる位置のすぐ周辺で地形が凸レンズのように飛び出しているか、凹面鏡のように引っ込んでいるかを示しています。飛び出しているとマイナスの値、引っ込んでいるとプラスの値が出てきます。

いま、公園のすべり台を思い浮かべてみましょう。一番上は平らですが、すべり始めのところはだんだんと傾きが急になっていくので、そのあたりの形は出っ張っています。つまり、ラプラシアンがマイナスの値をとります。だーっとすべるところは、出っ張っても引っ込んでもいない平面なので、ラプラシアンはゼロです。いちばん下にさしかかると、だんだんと傾きが緩やかになっていくので、形としては、引っ込んでいます。つまり、ラプラシアンがプラスの値をとります。

そういうわけで、ラプラシアンの符号が転ずるところを抽出すれば、傾きの最も急峻なところを抽出することに相当するというわけです。この方法のいいところは、幅ゼロの究極的に細い線でトレースしてくれることと、線をたどっていくと途切れずに一回りして必ず元の位置に戻ってくることです。

画像全体に対して、ラプラシアンの値がプラスまたはゼロの領域を黒く塗り、マイナスの領域を白く塗ることにすれば、どんな画像も白黒2色で塗り分けることができます。その境界線を抽出するのだから、上に述べた2つの性質は、成り立つのが当然です。

この方法だと、画像に載ったノイズを拾って蛇行しやすいので、あらかじめ「ガウシアン」と呼ばれる平滑化を施しておくという工夫が加えられています。それが「ガウシアン・ラプラシアンのゼロ交差」です。

この方法は一般的に広く使われているようなのですが、私はずいぶん前から、厳密に言って正しくはないなぁ、と気がついていました。いま、お山のすべり台を思い浮かべます。これは、丸い砂山のような、というか、釣鐘を地べたに置いたような、というか、そういう形のお山で、山頂から360°どっち方向にでもすべり降りることができます。このすべり台の勾配の最も急峻なところでラプラシアンの値はどうなっているでしょうか。

グラジエント方向には出っ張っても引っ込んでもいません。が、等高線方向には丸みを帯びて出っ張っています。だから、ラプラシアンはマイナスの値をとります。もう少し下まで行って、グラジエント方向のへこみと等高線方向の出っ張りがちょうど同じになって相殺しあったところでラプラシアンの値がゼロになります。つまり、輪郭線が曲がっているところでは、ラプラシアンのゼロ交差はカーブの外寄りに抽出されてしまうという欠点があるのです。

●ケバヤシアンの登場

正しい方法は、グラジエント方向に沿った2次微分の値のゼロ交差を抽出するというものです。こうすれば、お山のすべり台でも、最も急峻なところを抽出することができ、しかも、先ほどの2つの好都合な性質が保たれています。

これ、いちおう私が自力で思いつきました。なので、発案者をたたえて「ケバヤシアン」と呼んでいただけたらと思います。「ラプラシアンのゼロ交差」に代えて「ケバヤシアンのゼロ交差」というわけです。

だけど、私以前に同じことを考えた人はいないのでしょうか。いやいや、そんなことはないでしょう、きっと。画像処理の基礎的な手法の研究に従事している技術者なら、そんなに発見しづらい手法ではないような気がします。案外と古くからあって、ただ、あまり使われて来なかっただけなのかもしれません。

特許は検索してみました。近いところで、(株)東芝が1991年に出願した「画像処理装置」(特開平5-167927)というのがありました。医療向けの画像処理に関する発明で、DSA(digital subtraction angiography)という技術を用いて得た血管の画像から、血管の輪郭線を抽出する装置について述べられています。その内容は、まさにグラジエント方向の2次微分のゼロ交差を求めるというものです。ただし、中身の計算は私のと異なります。

東芝のは、グラジエント方向に画像の断面を求め、字義通りに2次微分のゼロ交差を探していきます。私のは、グラジエント方向の2次微分がひとつの数式で表現できているので、値がより正確に、しかも一発で求まります。なので、その違いを頼みに、私もいちおう出願しておきました。一年半後に自動的に公開されるので、特許庁のホームページに行って「ケバヤシアン」で検索をかけると出てくるでしょう。

だけど、基礎的な技術なので、権利化して独占的に使うよりも、広く使っていただいたほうが、個人的には嬉しいかな〜と思っています。審査で拒絶された場合は、使用料をいただく必要もないし。

それよりも、この方法って、効果のほどはどうなのでしょう。えっへん、実は、たいしたことないんです(ここまで引っ張っておいて、それかよ?)。いやいや、画像によるのです。パンダの写真みたいなやつでは、ラプラシアンもケバヤシアンも、結果に大差ありません。が、ある製品の電子顕微鏡画像のように、ぼやーっとボケている上に、ノイズに埋もれかけているような画像に対しては、効果てきめんなのです。そういう画像でしか違いが現れない上に、計算時間は余計にかかるので、今まで軽視されてきたのかもしれません。

●お待ちかねの(?)数式です

ちゃんと数式で示してくれなきゃ不明確ではないか、とじれている方がいらっしゃると思います、3人くらい。お待たせしました。

画像の面をX-Y平面とします。高さ方向にZ軸をとります。zをxで偏微分した値をzxと書きます(本当は、xはzの右下に添え字として小さく書くのですが)。同様に、zをyで偏微分した値をzyと書きます。
zをxで2回偏微分した値をzxx、yで2回偏微分した値をzyy、xで1回偏微分して、しかるのちにyで1回偏微分した値をzxyと書きます。
zのグラジエント▽zは
  ▽z = (zx, zy)
というベクトルです。

zのラプラシアン△zは  △z = zxx + zyyという式で示される値です。
zのケバヤシアン△Kzは
  △Kz = (zxx zx^2 + 2 zxy zx zy + zyy zy^2) / (zx^2 + zy^2)
という式で示される値です。a^2とはaの二乗を表しています。

ちょっとグロテスクな式ですね。だけど、見慣れるとかわいく見えてきます。この手法は、電子顕微鏡写真のように、荒れた画像を取り扱っている方には朗報なのではないかと思います。もしご興味がありましたら、ご連絡をいただければ、喜んで詳しくご説明いたします。

【GrowHair】GrowHair@yahoo.co.jp
画像処理技術の研究にかかわるサラリーマン。法律で印刷してはいけないことになっている画像をいちいち手作業で修正するのが面倒だから、画像処理で自動化できないか、という相談を受けたことがあります。実験に必要だからとサンプル画像をたくさんもらってきたのですが、うまいアイデアが浮かばず、結局、眺めただけで終わりました。今もひたすらそんな作業をしてる人がどこかにいると思うと心が痛みます。この場をお借りしてお詫び申し上げます。