【Python/OpenCV】OpenCVを使ったラベリング[connectedComponents編]

OpenCVを使ったラベリングについて。ここの丸パクリですが、備忘録ということで・・・。

    1. OpenCVで用意されているラべリング関数について
      ここを参考にさせていただきました。ラべリング処理は2種類あるそうです。
      1つ目のラべリング関数[connectedComponents]は,ラべリング画像のみを出力する簡易版。ラべリング画像のみを出力されても・・・って感じですが。
      2つ目のラべリング関数[connectedComponentsWithStats]は,重心や面積,バウンディングボックスの値(x,y,width,height)まで返してくれる詳細版。
//ラベリング(簡易版)
int cv::connectedComponents(InputArray image, OutputArray labels, int connectivity = 8, int ltype = CV_32S)

//ラベリング(詳細版)
int cv::connectedComponentsWithStats(InputArray image, OutputArray labels, OutputArray stats, OutputArray centroids,int connectivity = 8, int ltype = CV_32S)  
  1. HalconとOpenCVのラべリング処理の違い
    Halconの場合:二値化後のオブジェクト(Region)に対して、Connection関数を実行すると、一発でラべリングが終わる。統合開発環境Hdevelop上では、ラべリングされた後のRegion毎に自動的に色分けされる
    OpenCVの場合:二値化後のオブジェクト(画像)に対して、・・・・色々処理が必要。Halconに慣れた人だと、いざ使おうと思ったときに、コードが全く思い出せない。というか、Halconが特殊なんだと思う。
  2. 実際のコード[connectedComponents編]
    import cv2
    import numpy as np
    import copy
    import random
    import sys
    
    if __name__ == "__main__":
        
        #画像の入力
        src = cv2.imread("src.png", cv2.IMREAD_COLOR)
        
        #指定した画像が無ければエラーを返す
        if src is None:
            print("Failed to load image file.")
            sys.exit(1)
    
        #画像のサイズ(縦、横)、チャンネル数を取得
        height, width, channels = src.shape[:3]
    
        #出力画像を格納するdst画像メモリを確保
        dst = copy.copy(src)
            
        #カラー→モノクロ変換処理
        gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
        
        #画像の二値化処理
        ret, bin = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
        
        #ラべリング処理
        nLabels, labelImage = cv2.connectedComponents(bin)
    
        colors = []
        for i in range(1, nLabels + 1):
            colors.append(np.array([random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)]))
    
        for y in range(0, height):
            for x in range(0, width):
                if labelImage[y, x] > 0:
                    dst[y, x] = colors[labelImage[y, x]]
                else:
                    dst[y, x] = [0, 0, 0]
    
        #画像表示
        cv2.namedWindow("Source", cv2.WINDOW_AUTOSIZE)
        cv2.imshow("Source", src)
        cv2.namedWindow("Connected Components", cv2.WINDOW_AUTOSIZE)
        cv2.imshow("Connected Components", dst)
    
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    入力画像

    出力画像(ラべリング後の画像)