第42回目となる今回は、前回紹介した画像の領域分割(Image Segmentation)、Semantic Image Segmentationについて、もう少し詳しく説明していきます。

領域分割技術

領域分割の技術は大きく3つに分けることができます(この分類は一例です)。

・1つ目は、物体が何かは特定せずに、近傍の画素の輝度値(色)が類似している場合に同じ領域に属すると判定するものです。
・2つ目は、前景と背景に分類するものです。例えば、海辺に立っている人の写真で、人の領域のみを切り出したい場合は、人が前景、海や砂浜を背景として領域を分割します。
・3つ目は、物体の種別(人、道路、建物、空、車など)の識別と同時に、領域分割を行うものです。前回紹介したSemantic Image Segmentationがこれにあたります。

近傍の画素の輝度値と類似している場合に同じ領域に属すると判定する手法

ある1画素に注目し、注目画素とその近傍の画素の輝度値(または色)が類似していれば、同じ領域に属すると判定し同一のラベルを付与します。そして注目画素を1画素ずつシフトして同様の処理を繰り返すことで、画像全体の画素にラベルを付与していきます。

OpenCVには、pyrMeanShiftFiltering()という手法が実装されています。これは関数名のとおりMean Shift法を用いた手法です(参考文献[1])。この手法で領域分割した結果が図1です。同じ領域には同じ色(ラベル)が割り当てられています。机や床のタイルが複数の領域に分割されてしまっていたり、椅子がカーペットと同じ領域となってしまっていたりします。

図1 OpenCVのpyrMeanShiftFiltering()による領域分割の例

図1 OpenCVのpyrMeanShiftFiltering()による領域分割の例

Mean Shift法を用いたImage Segmentation

Mean Shift法の処理の概要は次のとおりです(図2)。
あるデータxを選択し、そのxを中心とする半径hの球(超球)を考え、球内にあるデータの重心xcを求めます。このとき、重心xcはxよりも密度の高い場所に存在します。xcを x に代入し同様の処理を繰り返すと、球の中心xは 密度の極大値へ向かって収束していきます。このように重心(平均値)への移動を繰り返すことで、密度分布関数の極大値を検出する手法がMean Shift法です。

図2 Mean Shift法の概要

OpenCVに実装されているpyrMeanShiftFiltering()の処理の概要は、以下のとおりです。

1.入力画像からL段階のピラミッド画像を作成します。ピラミッド画像のサイズは、1倍、1/2倍、1/4倍、…、1/2L-1倍となります。
2.注目画素の所定範囲内の画素で、かつ前回求めた色の平均値xから所定の半径以内のデータのみを抽出します。
3.抽出したデータから色情報の平均値xcを求め、xにxcを代入し色の平均値を更新します。
終了条件を満たすまでステップ2-3を繰り返します。そして最終的に求まった色情報の平均値xcが、近傍の画素で同様の処理をした際に得た平均値xcと同じだった場合に、同じ領域に属すると判定します。

そして、ピラミッド画像の解像度を上げ、同様の処理を行うことで、荒い領域分割結果から徐々に詳細な領域分割結果を生成します。

今回紹介したOpenCVに実装されているpyrMeanShiftFiltering()という手法は、影やテクスチャなどによって過剰に分割されるケースや、領域が結合されてしまうケースが頻繁に発生します。領域分割が正しくない場合に、領域の外接矩形で切り出した画像中に写っている物体を機械学習により識別しようとしても、正しく物体の種別を識別することができません。この手法を用いるのは、照明条件が一定で撮像対象が既知の場合や、他の処理の前処理などが良いでしょう。

次回は、「Semantic Image Segmentation」について、詳しく説明していきます!


参考文献
[1] Comaniciu, D., Meer, P. Mean Shift: A Robust Approach Toward Feature Space Analysis. IEEE Transaction on Pattern Analysis and Machine Intelligence, 603-619, (2002).