###実現したいこと
入力された画像をk-means法で減色し画像に使われている色を抽出したいです。
例えば下の画像なら(48, 153, 233), (65, 192, 134), (114, 98, 218), (192, 188, 65)を出力したいです。
###発生している問題
入力する画像が上の画像なら正常に動作するのですが画像によってはエラーが発生してしまいます。
該当のソースコード
python
1import numpy as np 2import cv2 3from matplotlib import pyplot as plt 4 5img = cv2.imread('tree.jpg') 6 7# マスキングして白の背景を取り除く 8gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 9threshold_value = 200 10ret, threshold_img = cv2.threshold(gray, threshold_value, 255, cv2.THRESH_BINARY) 11threshold_img = ~threshold_img 12masked_img = cv2.cvtColor(threshold_img, cv2.COLOR_GRAY2BGR) 13img = masked_img & img 14 15 16# メディアンフィルタで端をなめらかにする。 17threshold_img = cv2.medianBlur(threshold_img, 7) 18 19# 輪郭抽出を実行する。 20contours, hierarchy = cv2.findContours( 21 threshold_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE 22) 23 24for cnt in contours: 25 mask = np.zeros_like(img) 26 cv2.drawContours(mask, [cnt], -1, color=(255, 255, 255), thickness=-1) 27 masked = img & mask 28 29 colors = masked.reshape(-1, 3) 30 colors = colors[(colors != 0).all(axis=1)] 31 32 k = 1 33 criteria = cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0 34 ret, label, center = cv2.kmeans( 35 colors.astype(np.float32), k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS 36 ) 37 38 # 画像を表示する。 39 ax1.imshow(cv2.cvtColor(masked, cv2.COLOR_BGR2RGB)) 40 ax1.set_axis_off() 41 42 print("center", center)
発生するエラー
center [[113.]] --------------------------------------------------------------------------- error Traceback (most recent call last) <ipython-input-19-37cc64ede3fd> in <module>() 34 criteria = cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0 35 ret, label, center = cv2.kmeans( ---> 36 colors.astype(np.float32), k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS 37 ) 38 error: OpenCV(4.1.2) /io/opencv/modules/core/src/kmeans.cpp:241: error: (-2:Unspecified error) in function 'double cv::kmeans(cv::InputArray, int, cv::InputOutputArray, cv::TermCriteria, int, int, cv::OutputArray)' > Number of clusters should be more than number of elements (expected: 'N >= K'), where > 'N' is 0 > must be greater than or equal to > 'K' is 1
補足
Colaboratoryで特になにもカスタムなどせず上記を動かしています。
エラー以外でもここの処理はこうした方がいい、みたいのがあったら指摘してくださると嬉しいです。
あなたの回答
tips
プレビュー