こんにちは、eSOL エンジニアリング本部Medical課のS.Yです。
Medical課では、医療機器や研究向け製品をはじめとした医療・科学分野のエンジニアリングサービスを提供しています。
このブログシリーズでは、医療や科学分野において活用される画像認識技術や、それに付随する基礎的な画像処理技術について学ぶ社内勉強会において私が得た知見についてご紹介しています。
第4回(前回)では、セグメンテーションについて紹介しました。
第5回(今回)では、画像同士をつなぎ合わせて1枚の画像にする「タイリング」について取り上げます。
このブログシリーズでは、「焦点合成」をテーマとする第6回(次回)で最終回となりますので、ぜひ最後までご覧ください。
1. タイリングとは
タイリングとは、画像同士をつなぎ合わせる技術のことです。
画像の解像度と被写体範囲の広さは本来トレードオフの関係にありますが、この技術により高解像度の画像をつなぎ合わせることで、解像度の高さと被写体範囲の広さが両立します。
科学分野の応用例で言えば、顕微鏡を高倍率に設定して観察領域を少しずつずらしながら撮影し、各画像を配列してつなぎ合わせることで、広視野高倍率画像を作成することができます。
今回は単純に画像を縦横に連結させるだけでなく、スマートフォンのカメラアプリに搭載されているパノラマモードのように、連続して撮影された画像の共通する部分を見つけてつなぎ合わせる画像合成技術についても調査・実装しましたので、次章以降でご紹介します。
2. 画像の連結
まずこの章では、最も簡単な画像連結についてご紹介します。
ここでの画像連結は、2枚の画像を縦方向や横方向に連結させて1枚の画像とする処理を指します。
OpenCVではCv2.VConcatというメソッドにより縦方向、Cv2.HConcatというメソッドにより横方向の画像連結が可能です。
どちらのメソッドも、連結したい画像の配列と連結画像の出力先となる変数を指定することで、入力画像を連結した1枚の画像を取得できます。
注意点としては、連結したい画像のサイズを合わせておくことです。
縦方向の連結の場合は画像の幅、横方向の連結の場合は画像の高さを合わせておかないと、Cv2.VconcatやCv2.Hconcatの結果がエラーとなり、画像連結できません。
図5-2-1の4枚の画像をサイズ調整してから①~④の順で配列に格納し、画像連結を行った結果が図5-2-2です。
縦方向の画像連結では配列に格納した順に下方向に画像が連結され、横方向の画像連結では配列に格納した順に右方向に画像が連結されました。

図5-2-1 連結する元画像

図5-2-2 画像連結結果
縦方向の画像連結と横方向の画像連結を組み合わせることで、縦横の画像連結も可能です。
図5-2-1の4枚の画像を2×2で連結した結果が図5-2-3です。
このように、画像のサイズさえ合わせれば、所望の並びでタイリングをすることができます。
図5-2-3 2×2画像連結結果
3. Stitcherによる画像合成
OpenCVでは、Stitcherを用いてスキャン画像合成やパノラマ画像合成といった画像合成を実装することができます。
Stitcherは直訳すると「縫い合わせる人、もの」であり、その名の通り複数画像を縫い合わせて一つの大きな画像を生成します。
縫い合わせる際には画像同士で共通する部分(縫いしろ)が必要です。
図5-3-1のように、各画像の特徴点を比較し、マッチングする特徴点が多い領域を共通部分として認識します。
見つけ出した共通する部分を縫い合わせるようにして合成していくことで、2章でご紹介した単純な画像連結よりも接合部を滑らかにタイリング可能です。

図5-3-1 共通部分の探索
画像合成は、StitcherクラスのStitchメソッドを使うことで実装できます。
StitcherクラスのインスタンスはOpenCVのStitcher.Createメソッドで生成します。
Stitcher.Createメソッドの引数にはStitcherモードを指定することができ、このStitcherモードによるStitchメソッドで、スキャン画像合成を行うか、パノラマ画像合成を行うか選択が可能です。
3.1.でスキャン画像合成、3.2.でパノラマ画像合成についてそれぞれご紹介します。

図4-3-2 微細藻類のサンプル画像
3.1. スキャン画像合成
スキャン画像合成は、スキャナーにより画像をスキャンするイメージで画像を合成します。
図5-3-2のようにカメラ位置を平行移動させて、同一の焦点面の被写体を撮影するようなケースで用いられる手法です。
科学分野では、顕微鏡で撮影した画像に対して使われます。

図5-3-2 スキャン画像合成のイメージ
※四角は撮影領域、線はカメラ位置と撮影領域を結ぶ線を表す
以降、実際に実装したスキャン画像合成を使った例をお見せします。
図5-3-3の画像を題材とし、以下の手順でスキャン画像合成を試してみました。
- 画像をトリミングし、元画像の断片となる画像を作成する
- 画像同士に少しずつ重なる領域ができるように4枚のトリミング画像を用意する
- 4枚のトリミング画像をスキャン画像合成により合成し、1枚の画像を作成する
- スキャン画像合成の結果、元画像が再構成されることを確認する

図5-3-3 スキャン画像合成に使用した画像
画像のトリミングは、図5-3-4の4つの四角で囲われた範囲で実施しました。
画像中央に写っている細胞を共通する部分としてすべてのトリミング範囲に入れています。
トリミングの結果得られた4枚の画像が図5-3-5です。
この4枚の画像をStitchメソッドのインプット画像として指定し、スキャン画像合成を行いました。

図5-3-4 トリミング範囲

図5-3-5 トリミング後の4つの画像
図5-3-6は、元画像(左)とスキャン画像合成結果の画像(右)の比較です。
4枚の画像をつなぎ合わせていますが、それぞれの画像同士のつなぎ目部分などに違和感なく合成できました。

図5-3-6 スキャン画像合成結果
3.2. パノラマ画像合成
スキャン画像合成が水平な面上の被写体に対して有効な手法であったのに対して、パノラマ画像合成は、球面上の被写体に対して有効な手法です。
図5-3-7のようにカメラ位置を固定させて、カメラの向く方向を少しずつずらしながら風景などを撮影した場合に用いられます。

図5-3-7 パノラマ画像合成のイメージ
医療、科学分野ではあまり使われていませんが、勉強会では動作を確認するために図5-3-8の風景画像に対してパノラマ画像合成を実施しました。

図5-3-8 パノラマ合成の元画像
図5-3-8の6枚の画像をStitchメソッドのインプット画像として指定し、パノラマ画像合成を行った結果が図5-3-9です。
パノラマ画像合成により、広範囲の風景を1枚の画像に収めることができました。
各画像を球面に並べてつなぎ合わせていくため、画像の端が曲線になっていたり、斜めに傾いたりしているものと考えられます。
図5-3-9 パノラマ画像合成結果
4.最後に
第5回ではタイリングがどういったものかご紹介しました。
OpenCVのメソッドを使って、画像の連結とStitcherによる画像合成を実装し、実際に微細藻類や細胞の顕微鏡画像をイメージしたサンプル画像に適用しました。
Stitcherではスキャン画像合成とパノラマ画像合成の実装が可能で、それぞれ撮影の仕方や被写体の種類によって使い分けられることがわかりました。
科学分野、特に顕微鏡画像などは、同一平面上の被写体に対してカメラを平行移動させながら撮影するため、スキャン画像合成が適切だと考えられます。
今回はサンプル画像をトリミングすることで、疑似的にカメラを平行移動して撮影したような複数画像を用意し、スキャン画像合成によりトリミング前の画像が再構成できることを確認しました。
次回の第6回では「焦点合成」について取り上げます。
焦点合成とは、複数の位置にピントを合わせた画像を合成して、複数位置にピントが合っているような画像を作成する技術です。
タイリングは2次元平面内で撮影した画像をつなぎ合わせる手法でしたが、焦点合成は奥行き方向に分けて撮影した画像を合成します。
科学分野では顕微鏡で撮影した画像などに活用されます。
次回もぜひご覧ください。
また冒頭でご紹介した通り、eSOLは医療分野のエンジニアリングサービスを提供しており、豊富な実績があります。
医療分野のみならず、車載・産業などの幅広い領域における開発実績で身に着けた安全性の高い開発プロセスなどの知見や技術力は、お客様の求めるお客様が目指す高性能で高品質な開発を強力に支援します。
医療分野の製品開発で課題がある、今回ご紹介したような画像認識技術に関わる開発を実施したい、エンジニアリングサービスについて詳しく知りたい、という方はぜひお気軽にeSOLにご相談ください。
Medical課 S.Y