とか、など

プログラミングとか、画像処理とか、機械学習を勉強しようとして挫折中

python3 opencv3入門-ラベリング

さてさて、二値化、フィルタ、モフォロジーときたら次はラベリングですね。

 

二値化して、モフォロジーをかけたら、次は孤立領域ごとに分けたくなるというのが人情です。opencvにはconnectedComponentsという関数がありまして、これを二値画像に適応するといい感じに分離してくれます。

nLabelsにはいくつの孤立領域があるか、labelImageにはラベリング済みの画像が入ります。

 

import cv2
import numpy as np
import copy
import random
from matplotlib import pyplot as plt

img = cv2.imread('./images/test1.png', cv2.IMREAD_COLOR)#カラー画像としてよみ出し
height, width, channels = img.shape[:3]
dst = copy.copy(img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) #白対領域となるのでINVを指定
nLabels, labelImage = cv2.connectedComponents(binary)

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]

print(nLabels)
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.xticks(), plt.yticks()
plt.subplot(122), plt.imshow(dst, 'gray'), plt.title('LABEL')
plt.xticks(
), plt.yticks([])
plt.show()

f:id:hikuIchi:20160214154548p:plain

 

孤立領域ごとに明るさが違うのがわかりますでしょうか。

コードはここを参考にしました

[OpenCV Python]OpenCVを使ったラベリング · atinfinity/lab Wiki · GitHub