k-means法にてRBG空間においての代表色3つは表示できるようにしているのですが、これをHSVでのパラメータに変えて表示したいです(紫などの色を指定する際に難しいため)
現在はRBGの範囲を指定して色を分けていたが、Hを指定することで色を区別したい。
python
1 2import cv2 3import numpy as np 4 5from matplotlib import pyplot as plt 6from sklearn import datasets 7from sklearn.cluster import KMeans 8 9 10 11# 画像を読み込む。 12img = cv2.imread("パス") 13 14# HSV に変換する。 15hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 16 17# 水色かどうかで2値化する。(水色は0、それ以外は255) 18binary = cv2.inRange(hsv, lowerb=(0, 0, 100), upperb=(180, 45, 255)) 19binary = ~binary 20 21# メディアンフィルタで端をなめらかにする。 22binary = cv2.medianBlur(binary, 7) 23 24# 輪郭抽出を実行する。 25contours, hierarchy = cv2.findContours( 26 binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE 27) 28 29for cnt in contours: 30 # ROI 領域以外をマスクする。 31 mask = np.zeros_like(img) 32 cv2.drawContours(mask, [cnt], -1, color=(255, 255, 255), thickness=-1) 33 masked = img & mask 34 35 # 色一覧 36 colors = masked.reshape(-1, 3) 37 colors = colors[(colors != 0).all(axis=1)] # 黒は除く 38 39 # k平均法でクラスタリングする。 40 k = 3 41 criteria = cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0 42 ret, label, center = cv2.kmeans( 43 colors.astype(np.float32), k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS 44 ) 45 46 # 円の中に含まれる代表色 Top3 を可視化する。 47 fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(10, 5)) 48 # 各クラスに属するサンプル数を計算する。 49 height = [np.count_nonzero(label == i) for i in range(k)] 50 # 各クラスたの色を取得する。matplotlib の引数の仕様上、[0, 1] にして、(R, G, B) の順番にする。 51 rep_color = (center / 255)[:, ::-1] 52 53 # 画像を表示する。 54 ax1.imshow(cv2.cvtColor(masked, cv2.COLOR_BGR2RGB)) 55 ax1.set_axis_off() 56 57 # ヒストグラムを表示する。 58 ax2.barh(np.arange(k), height, color=rep_color, tick_label=height) 59 plt.show() 60 61 62
質問はなんでしょうか
あなたの回答
tips
プレビュー