OpenCVを使ったラベリングについて。ここの丸パクリですが、備忘録ということで・・・。
-
- OpenCVで用意されているラべリング関数について
ここを参考にさせていただきました。ラべリング処理は2種類あるそうです。
1つ目のラべリング関数[connectedComponents]は,ラべリング画像のみを出力する簡易版。ラべリング画像のみを出力されても・・・って感じですが。
2つ目のラべリング関数[connectedComponentsWithStats]は,重心や面積,バウンディングボックスの値(x,y,width,height)まで返してくれる詳細版。
- OpenCVで用意されているラべリング関数について
//ラベリング(簡易版) 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)
- HalconとOpenCVのラべリング処理の違い
Halconの場合:二値化後のオブジェクト(Region)に対して、Connection関数を実行すると、一発でラべリングが終わる。統合開発環境Hdevelop上では、ラべリングされた後のRegion毎に自動的に色分けされる
OpenCVの場合:二値化後のオブジェクト(画像)に対して、・・・・色々処理が必要。Halconに慣れた人だと、いざ使おうと思ったときに、コードが全く思い出せない。というか、Halconが特殊なんだと思う。 - 実際のコード[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()
入力画像
出力画像(ラべリング後の画像)