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()
孤立領域ごとに明るさが違うのがわかりますでしょうか。
コードはここを参考にしました
[OpenCV Python]OpenCVを使ったラベリング · atinfinity/lab Wiki · GitHub