eSOL Marketing Official Blog

「基礎から学ぶ医療・科学分野で活用される、OpenCVによる画像認識技術」第4回セグメンテーションについて実例を用いて解説

2025/06/26 10:00:00
こんにちは、eSOL エンジニアリング本部Medical課のS.Yです。

Medical課では、医療機器や研究向け製品をはじめとした医療・科学分野のエンジニアリングサービスを提供しています。

このブログシリーズでは、医療や科学分野において活用される画像認識技術や、それに付随する基礎的な画像処理技術について学ぶ社内勉強会において私が得た知見についてご紹介しています。

第3回では、ハフ変換を用いた直線検出について紹介しました。
第4回では、画像を複数のオブジェクトに分割する「セグメンテーション」について取り上げます。

計6回に分けて投稿予定ですので、ぜひ最後までご覧ください。

  • 第5回 タイリング
  • 第6回 焦点合成
目次

 

1. セグメンテーションとは

セグメンテーションとは、画像に写るものを分類分けして領域分割する画像認識技術のことです。
顕微鏡画像や医療用画像中から細胞や疾患の領域を認識するなど、科学・医療分野でも活用されている技術です。
セグメンテーションには大きく分けて、「インスタンスセグメンテーション」、「セマンティックセグメンテーション」、「パノプティックセグメンテーション」の3種類があります。

 

  1. インスタンスセグメンテーション

    「インスタンスセグメンテーション」は直訳すると「実例分割」であり、画像内のオブジェクトを検出して個体ごとに領域分割する手法です。
    図4-1-1はインスタンスセグメンテーションのイメージです。
    左側の元画像の内、白い部分をオブジェクト、黒い部分を背景として識別し、右側の画像の色分けのようにオブジェクトを分類分けします。
    インスタンスセグメンテーションでは画像中の各オブジェクトの輪郭や位置を特定するため、同一のオブジェクトがあっても識別が可能ですが、逆に背景については情報を得ることができません。

    250626_1

    図4-1-1 インスタンスセグメンテーションのイメージ

  2. セマンティックセグメンテーション 


    「セマンティックセグメンテーション」は直訳すると「意味の分割」であり、画像の各ピクセルにラベル付けしていくことで分類分けを行う手法です。
    図4-1-2はセマンティックセグメンテーションのイメージです。
    セマンティックセグメンテーションでは、右画像の色分けのように画像中のオブジェクトだけでなく背景なども含めてすべてのピクセルを分類分けできるのが特長です。
    一方で、画像中に同一のオブジェクトが複数ある場合に、それらを個別のオブジェクトとして認識することができないのが難点です。

    250626_2

    図4-1-2 セマンティックセグメンテーションのイメージ

  3. パノプティックセグメンテーション 


    「パノプティックセグメンテーション」は直訳すると「総括的な分割」であり、セマンティックセグメンテーションとインスタンスセグメンテーションを組み合わせた高度な手法です。
    前の2つの手法の短所を補い合い、より多くの情報を得ることができます。


    今回の勉強会ではインスタンスセグメンテーションについて学びましたので、以降インスタンスセグメンテーションについて、実例と共にご紹介します。
     

2. エッジ検出を使ったインスタンスセグメンテーション

インスタンスセグメンテーションでは、画像中のオブジェクトを背景から識別します。
オブジェクトと背景を識別する方法はいくつかありますが、単純なのはエッジ検出を使う方法です。
エッジ検出により画像中のオブジェクトの輪郭が分かれば、その内側がオブジェクト、外側が背景と判別することができます。

  1. エッジ検出セグメンテーションの手順

    オブジェクトの輪郭を抽出するためにブログ第2回でご紹介した「エッジ検出」を使用します。
    以下がエッジ検出を使ったセグメンテーションの典型的な手順です。


    1.    グレースケール化
    2.    ノイズ除去
    3.    エッジ検出
    4.    輪郭抽出


    1~3の手順は、ブログ第2回でも実施していたエッジ検出の手順です。
    このエッジ検出により、図4-2-1のように抽出したいオブジェクトの輪郭が得られていれば、OpenCVに用意されているメソッドを使ってエッジで囲われている領域を一つのオブジェクトとして認識できるようになります。

    250626_3

    図4-2-1 ノイズを除去したエッジ検出の例

     

  2. エッジ検出セグメンテーションの実装 

    勉強会では、OpenCVのFindContoursというメソッドを使ってエッジ検出セグメンテーションを実装しました。
    このメソッドでは、輪郭で囲われている領域をオブジェクトとして認識することができます。
    セグメンテーションの対象となるエッジ検出後の画像と、輪郭座標取得方法、輪郭階層情報取得方法を指定することで、オブジェクト毎の輪郭座標と輪郭階層情報を取得できます。

    輪郭座標取得方法には、NONE、SIMPLE、TC89_L1、TC89_KCOSの4種類があります。


    ・NONE
     輪郭上のすべての座標を取得。


    250626_4

    図4-2-2 輪郭座標のイメージ(NONE)

    ・SIMPLE
     輪郭を構成する縦、横、斜め45°方向の直線の両端の座標のみを取得。

    250626_5

    図4-2-3 輪郭座標のイメージ(SIMPLE)

    ・TC89_L1、TC89_KCOS
     輪郭を直線で複数の直線の組み合わせで近似して、各直線の両端の座標のみを取得。

    250626_6

    図4-2-4 輪郭座標のイメージ(TC89_L1、TC89_KCOS)

    輪郭階層情報取得方法には、EXTERNAL、TREE、LIST、CCOMPの4種類があります。
    EXTERNALは一番外側の輪郭だけを取得し、階層情報は取得しません。
    その他の3つは階層情報を取得することができ、それぞれ階層情報の出力の仕方が異なります。

    ・TREE
     その名の通りツリー構造で、内側にある輪郭ほど下の階層に格納されます。

    ・LIST
     すべての輪郭を階層で分けずに配列として取得します。

    ・CCOMP
     白の輪郭(外側)と黒の輪郭(内側)の2つの階層のみ取得し、それよりも内側の輪郭は別の列に格納されます。

    輪郭の内側に別の輪郭があるようなケースでは、輪郭の階層情報によって外側の輪郭か内側の輪郭かを判別することができます。

    以降、実際に実装したエッジ検出セグメンテーションを使って、オブジェクトごとに分割した例をお見せします。
    図4-2-5は、元画像とエッジ検出により4つの藻類の輪郭のみを検出した結果です(エッジ検出方法の詳細はブログ第2回を参照してください)。
    輪郭は赤線で示しています。


    250626_7

    図4-2-5 輪郭検出結果

     

    図4-2-6は、輪郭検出結果に対してFindContoursメソッドを適用し、取得したオブジェクトを緑線の矩形で囲った結果です。
    今回使った画像では階層構造はないので、単純にFindContoursメソッドで取得した輪郭座標のみを使いました。
    OpenCVのCV.BoundingRectメソッドに輪郭座標を指定することで、輪郭すべてを囲う最小の矩形を取得することができます。

    250626_8

    図4-2-6 セグメントを矩形で囲った結果

     

    最後に矩形で囲った領域を画像から切り出します。
    OpenCVのCloneメソッドに矩形の座標を指定することで、矩形部分のみを切り出した結果が図4-2-7の4つの画像です。
    このように、エッジ検出を使ったセグメンテーションによりオブジェクト毎に分割することで、今回のように別の画像として切り出したり、それぞれ別の画像処理を行ったりすることなどが可能です。

    250626_9

    図4-2-7 セグメント切り出し結果

  3. エッジ検出セグメンテーションの欠点

    エッジ検出セグメンテーションは実装が比較的単純で扱いやすい手法ですが、一方で適用できる画像に制限があります。
    例えば、図4-2-8のようにオブジェクト同士が隣接するケースだと、エッジ検出により輪郭をうまく抽出することができません。
    第2回ブログでご紹介した通り、エッジ検出では隣り合う画素値の変化量が大きいところをエッジとして検出します。
    2つのオブジェクトが隣接して輪郭が重なる場合は、重なっている部分の画素値の変化量が小さくなり、エッジとして検出されなくなってしまいます。
    図4-2-8のエッジ検出結果のように輪郭がうまく抽出できていない場合は、それぞれのオブジェクトを識別できず、セグメンテーションはできません。
    そのためこのようなオブジェクト同士が隣接するケースでは、次の3章でご紹介するWatershedアルゴリズムを使う必要があります。

    250626_10

    図4-2-8 エッジ検出が難しい例


3.Watershedアルゴリズムを使ったインスタンスセグメンテーション

  1. Watershedアルゴリズムとは

    Watershedには、「分水嶺」や「流域」といった意味があります。
    画像の輝度勾配を地形に見立てて、そこに中央から水を流したときに水をせき止める分水嶺を輪郭として判定する手法です。
    図4-3-1は、黒い円形のオブジェクトが写る画像に対してWatershedアルゴリズムを適用する際のイメージです。
    図4-3-1の上の画像に対して赤い線上の画素値をプロットする図中下に示したような画素値の分布となります。
    黒い円形のオブジェクトの中央(青い矢印の位置)から水を注いでいくことを想像すると、画素値が大きく変化する輪郭部分を分水嶺として水が溜まるのがイメージできると思います。
    Watershedアルゴリズムではオブジェクトの中央から輪郭を探すため、隣接するオブジェクトでもセグメンテーションが可能です。
    この手法ではあらかじめオブジェクトの位置を特定する必要があるため、アルゴリズムを適用する以前にいくつかの画像処理を行います。
    3.2.ではこれらの画像処理も含めたWatershedアルゴリズムセグメンテーションの手順をご紹介します。


    250626_11

    図4-3-1 Watershedアルゴリズムのイメージ

     

  2. Watershedセグメンテーションの手順 

    Watershedアルゴリズムによるセグメンテーションは以下の手順で行います。

    1.    二値化
    2.    オープニング処理
    3.    背景の抽出
    4.    オブジェクトの抽出
    5.    Watershedアルゴリズム
    6.    輪郭抽出

    Watershedアルゴリズムを適用するためには、画像中のオブジェクトの位置(水を注ぐ位置)を特定しておく必要があります。
    1~4はそのための事前の画像処理です。
    最初に画像を二値化(白黒画像化)し、オープニング処理によりノイズを除去した上で、画像の各画素をオブジェクトと背景に切り分けます。
    上記手順のプログラムを実装し、実際に図4-3-2の微細藻類の画像に適用した結果を3.3.で手順ごとにお見せします。


    250626_12

    図4-3-2 微細藻類のサンプル画像

  3. Watershedセグメンテーションの実装

    3.2.の手順に従ってプログラムを実装し、図4-3-2のサンプル画像に適用してみました。
    以降、各手順の詳細と画像処理の途中経過をご紹介します。
     
    1. 二値化
      OpenCVのCv2.Thresholdメソッドを使って二値化を実装しました。
      このメソッドでは、すべての画素値に対して、しきい値を境に二値に分けることができます。
      どの二値に分けるかも引数で指定することができますが、一般的には白と黒の2色に分けます。
      今回しきい値については、Cv2.Thresholdメソッドに組み込まれている大津法というアルゴリズムを使って決定しました。
      図4-3-2の微細藻類の画像に対して二値化を行った結果が図4-3-3です。


      250626_13

      図4-3-3 二値化後の画像

    2. オープニング処理
      OpenCVのCv2.MorphologyExメソッドを使ってオープニング処理を実装しました。
      オープニング処理とは、モルフォロジー演算という、画像の形状や構造を変化させることでノイズを除去するフィルタリング処理の内の一つです。
      Cv2.MorphologyExメソッドでは演算タイプの一つとしてオープニング処理を指定することができます。
      オープニング処理では画像中の白い部分を収縮してから膨張させます。
      ここで収縮とは、ある白い画素の周辺に一つでも黒い画素があれば黒に置き換える処理であり、膨張は逆にある黒い画素の周辺に一つでも白い画素があれば白に置き換える処理です。
      この処理により、画像中のオブジェクトはそのまま残しつつ、小さな白い点(ノイズ)を消すことができます。
      この手順以降は画像中の白い部分をオブジェクト候補、黒い部分を背景候補としてとらえることになりますので、今回使用している画像に対しては二値化後に白黒反転を行い、その後にオープニング処理を実施しました。
      オープニング処理後の画像が図4-3-4です。
      図4-3-3では円形の藻類の内側に小さな点がありましたが、図4-3-4を見るとオープニング処理によりそれらの点が消えているのが分かります。

      250626_14

      図4-3-4 オープニング処理結果

    3. 背景の抽出
      画像中のオブジェクトを抽出するために、まずは画像中で明確に背景である領域を抽出する必要があります。
      オブジェクトと背景の境界部分はオブジェクトかどうかの見極めが難しいため、オープニング処理の時と同様に画像中の白い部分を膨張させることで、境界部分は一旦白に置き換え、残りの黒い領域を確実な背景とみなします。
      膨張はOpenCVのCv2.Dilateメソッドを使って実装しました。
      オープニング処理後の画像を膨張させた結果が図4-3-5です。

      250626_15

      図4-3-5 背景抽出結果

    4. オブジェクト位置の抽出
      オブジェクト位置の抽出には3で取得した背景からの距離を使います。
      背景から十分に遠い白い画素は確実にオブジェクトであるとみなすことができ、オブジェクトの位置にあたりをつけることができます。
      OpenCVのCv2.DistanceTransformメソッドを使うことで、画像中の白い画素から見て最も近い黒い画素までの距離を取得できます。
      図4-3-6はCv2.DistanceTransformメソッドで取得した背景からの距離情報のマッピング画像です。
      背景からの距離が遠い画素ほど明るく表示されています。

      250626_16

      図4-3-6 背景からの距離


      続いて距離情報に対してしきい値を設定することで、確実にオブジェクトである領域のみを残します。
      今回しきい値は、背景からの距離の最大値(図4-3-6の画像で最も明るい画素値)の半分に設定しました。
      確実にオブジェクトである領域を抽出した結果が図4-3-7です。
      4つの藻類の中央部分のみを取得することができました。

      250626_17

      図4-3-7 オブジェクト位置抽出結果

    5. Watershedアルゴリズム
      1~4までで得られたオブジェクトの位置情報を使ってWatershedアルゴリズムを適用しました。
      OpenCVのCv2.Watershedメソッドを使うことで、画像中のオブジェクトの輪郭情報を取得できます。
      Cv2.Watershedメソッドで得られた輪郭を白く表示したものと、元画像に対してエッジ検出を行った結果の比較が図4-3-8です。
      エッジ検出ではオブジェクト同士の隣接する部分がつながってしまいましたが、Watershedアルゴリズムで得られた輪郭は4つのオブジェクトで分離できているのが分かります。

      250626_18

      図4-3-8 エッジ検出結果とWatershedアルゴリズム適用結果の比較

    6. 輪郭抽出
      最後に2章と同様にFindContoursメソッドを使うことで、輪郭で囲われている領域をオブジェクトとして識別できます。
      Watershedアルゴリズムによる取得した輪郭情報を使ってオブジェクト識別を行った結果が図4-3-9です。
      右側2つの藻類は識別に成功しました。
      一方で、左側2つの藻類は識別できず一つのオブジェクトとして抽出されてしまいました。
      図4-3-8のWatershed結果でも、左側2つが隣接している部分はよく見ると一本の線になっており、うまく分離できていないものと思われます。
      Watershedアルゴリズムは、エッジ検出と比べると隣接するオブジェクトのセグメンテーションに有効ですが、輪郭同士が接しているようなケースではうまく分離できない場合もあるということが分かりました。

      250626_19

      図4-3-9 輪郭抽出によるオブジェクト識別結果

 

4.最後に

第4回ではインスタンスセグメンテーションがどういったものかご紹介しました。
OpenCVのメソッドを使って実装が可能なエッジ検出を使った手法と、Watershedアルゴリズムを使った手法の2種類を実装し、それぞれ実際に微細藻類の画像に適用しました。
両方の手法で画像中の微細藻類のセグメンテーションに成功し、オブジェクト毎の画像に分割することができましたが、特にエッジ検出セグメンテーションでは隣接するオブジェクトの分離が困難なことが分かりました。
Watershedアルゴリズムを使った手法では、エッジ検出を使った手法と比べて少し手順が複雑でしたが、隣接するオブジェクトのセグメンテーションにも適用することができました。

次回の第5回では「タイリング」について取り上げます。
タイリングとは、画像同士をつなぎ合わせる技術です。
顕微鏡等で撮影した複数の高解像度画像をつなぎ合わせることで、広視野高解像度画像を作成できるなど、科学・医療分野で様々な目的で活用されます。
次回もぜひご覧ください。

また冒頭でご紹介した通り、eSOLは医療分野のエンジニアリングサービスを提供しており、豊富な実績があります。
医療分野のみならず、車載・産業などの幅広い領域における開発実績で身に着けた安全性の高い開発プロセスなどの知見や技術力は、お客様の求めるお客様が目指す高性能で高品質な開発を強力に支援します。

医療分野の製品開発で課題がある、今回ご紹介したような画像認識技術に関わる開発を実施したい、エンジニアリングサービスについて詳しく知りたい、という方はぜひお気軽にeSOLにご相談ください。

 

 

Medical課 S.Y

🔰リアルタイムOS 初心者向け特集

リアルタイムOS(RTOS)の基礎を学ぶための動画・資料・ブログをまとめました
一覧ページを見る

最近の記事

ブログの更新通知を受け取る