こんにちは、林昌希です。今回から数回に分けて、以前、反響が大きかった「人工知能で用いるコンピュータビジョン技術」のように、本編からは一旦離れて、コンピュータビジョンの中でも「基礎的な画像処理」を応用したものである「漫画風画像生成処理」というアプリケーションを紹介します。そして「漫画カメラ」というiPhoneのアプリを通して、基礎的な画像処理を用いてどのように漫画風画像生成処理が実現されるかをみていくことにします。

漫画カメラとは?

「漫画カメラ」は2012年9月11日のiTunes Storeでのアプリ公開から、非常に短い期間でユーザー数を飛躍的に伸ばしており、すでに全世界で300万ダウンロードを達成した人気アプリです。このアプリは日本のスーパーソフトウエアがリリースしたもので、TumblerのCEOであるデビッド・カープ氏が自身のTumblrに漫画カメラで処理した画像を投稿したことで海外でも話題になり、日本以外の国でも人気が出て来ているもようです。

漫画カメラは、その名の通り「漫画風の画像を撮影できるカメラ」アプリです。あらかじめ用意されている「漫画フレーム(下図)」を設定画面においてあらかじめ選択しておくことにより、撮影時にその設定したフレームを用いて撮影した写真を漫画風のモノクロ写真に変換して、漫画風の画像を生成してくれるというアプリです。

漫画カメラの概要

漫画カメラの画像処理の基本手順を理解する

漫画カメラの画像処理を理解するために、まずは「撮影した写真を漫画風のモノクロ写真に変換する」という処理がどのような手順を踏むかについて考えていきましょう。

実際の漫画の原稿では、漫画家は黒のペンを用いて輪郭を描きます。ただ、このままだと黒で塗りつぶすか、各領域を自分で細かく描いていくことになり、このまま黒ペンだけで描き込んでいくと労力が高くつくので、漫画家は「スクリーントーン」を各領域に貼り付けていきます。スクリーントーンは細かい編み模様や洋服の模様に使えるものなど様々な模様のものがあり、これを貼ることによりそのスクリーントーンの模様で、各領域を短時間でバラエティ豊かに埋めることができるわけです。

また、スクリーントーンの再現に加えて、漫画風の画像に自動編集するためには「エッジ検出」という処理により、輪郭の自動抽出を行う必要があります。「エッジ」とは、デジタル画像中の輝度の変化が激しい境界線のことをさします。もっと直感的に言えば「人間がペンで描いた輪郭に相当するような、細いエッジ領域を抽出した画像をつくり出す処理」がエッジ検出であるとも言えるでしょう。

つまり、このエッジ処理した結果の画像が「人間の視覚に感じる境界線に近いエッジを持つ画像」であればあるほど、漫画家が黒ペンで描いた輪郭線のような輪郭線だけをうまく抽出できていると言えます。エッジ抽出で生成した輪郭と、スクリーントーンを自動的に貼る処理という2つの処理結果があれば、漫画風の画像が自動的に画像処理で生成できることになります。

それではまず、エッジ検出の代表的な手法であり、漫画カメラでも使われているであろうと思われる「Canny エッジ検出器」というエッジ検出手法の仕組みを紹介していきます。その紹介が終わったのち、スクリーントーンを貼る処理をどのように行うかを紹介し、これにより漫画風画像を生成する処理の全体像を説明します。

Cannyエッジ検出器を使うと、漫画カメラのように漫画のような輪郭を抽出できることができますが、本当の漫画家の原稿レベルでエッジを検出できるものではないことには注意してください。あくまで、おおまかにエッジを抽出してくるだけで、人間が知覚しているようなエッジが抽出されるわけではないことには注意です。(※ より人間の知覚に近い境界線を自動抽出してくれる、もっと発展的な境界検出手法は存在しているのですが、今回は基本的な画像処理の紹介が焦点なので割愛します)。

「Canny エッジ検出器」の処理

Cannyエッジ検出は以下の3つの処理を順に行います

  1. 入力画像のDoG画像(Difference of Gaussian)を生成
  2. Non-maximal suppression(局所的に最大値以外を0に抑える)
  3. ヒステリシスしきい値処理

3つの処理の説明をする前に、まずはエッジ検出の基本的な概念を説明します。エッジは、ある狭い領域で画素値が急激に変化している場所が「境界線」であるとして、これを「エッジ部での画素値の急激な変化」とみなすことができます(エッジ処理は、グレースケール画像を用いた処理である点に注意してください)。

画像中のあるエッジ(輪郭)の境界線に垂直な方向(法線方向)において、その法線方向の直線上での各画素値の変化を考えてみましょう。このとき、そのエッジを超えたときの画素値の急激な変化を自動的に取得するには、もとの画像の値を微分した画像(微分画像)上の最大値(=山。最も白に近い値)と最小値(=谷。最も黒に近い値)を狭い領域ごとに検出することで、その場所をエッジとして検出することができます。つまりは微分画像でのピーク値を取る場所が、元の画像での画素の値の変化(勾配)が最も急なところであるので、その場所をエッジと見なすことができるのです。したがって、元画像を微分した1次微分画像を更にもう一度微分して「2次微分画像」を作成すれば、2次微分画像上で値が0である場所が「1次微分画像での山もしくは谷」に相当するとみなす処理を行うことができます。