ルマンドの研究ブログ

先端と事業化の狭間で揺れる研究系エンジニアの日誌です。自動走行、自律走行、コンピュータビジョンなど。

Python + openCV でラベリング&疑似カラー

openCV3 から画像中の連結成分を取得する connectedComponents が実装されたそうですが、実は openCV2 でも distanceTransformWithLabels を使用することで、ほぼ同じことができます。

# -*- coding: utf-8 -*-

import cv2
import numpy as np

def label_image(img):
    img_dist, img_label = cv2.distanceTransformWithLabels(255 - img, cv2.cv.CV_DIST_L2, 3)
    return (np.uint8(img_label) & img)

# load binary image
img = cv2.imread("label.png", 0)
img_label = label_image(img)

# access each label
label_num = np.max(img_label)
for i in range(1, label_num + 1):
    cv2.imshow("label" + str(i), np.uint8(img_label == i) * 255)

# pseudocolor
img_label_normal = cv2.normalize(img_label, alpha=0, beta=255, norm_type=cv2.cv.CV_MINMAX)
img_label_color = cv2.applyColorMap(img_label_normal, cv2.COLORMAP_JET)
cv2.imshow("label", img_label_color)
cv2.waitKey(0)

入力画像 label.png
f:id:LUMONDE:20151028231007p:plain

実行結果
f:id:LUMONDE:20151028231020p:plain


なお、openCV2.4 以降では、疑似カラー画像を applyColorMap で一発で作成できます。デプス画像の着色などに便利ですね。