K-Means-кластеризация находит кластеры с одинаковыми значениями.Ваш ввод представляет собой массив значений цвета, следовательно, вы найдете цвета, которые описывают 2 кластера.[255 255 255]
- белый цвет, [ 89 173 1]
- зеленый.Аналогично для [112]
и [255]
в версии в оттенках серого.То, что вы делаете, это цветовое квантование
Они правильно центроиды, но их размер - цвет, а не местоположение.Поэтому вы нигде не можете построить это.Ну, вы можете, но я выгляжу так:
Посмотрите, как «местоположение цвета» определяет, какому классу принадлежит каждый пиксель?
Это не то, что вы можете найти на своем изображении.Что вы можете сделать, так это найти пиксели, которые принадлежат различным кластерам, и использовать местоположения найденных пикселей, чтобы определить их центроид или «среднее» положение.
Чтобы получить «среднее» положение каждого цвета,Вы должны выделить пиксельные координаты в соответствии с классом / цветом, к которому они принадлежат.В приведенном ниже коде я использовал np.where( img <= 240)
, где 240 - порог.Я использовал 240 с легкостью, но вы можете использовать K-Means, чтобы определить, где должен быть порог.( inRange () может быть полезно в какой-то момент)) Если вы сложите координаты и поделите их на количество найденных пикселей, у вас будет то, что, я думаю, вы ищете:
Результат:
Код:
import cv2
# load image as grayscale
img = cv2.imread('D21VU.jpg',0)
# get the positions of all pixels that are not full white (= triangle)
triangle_px = np.where( img <= 240)
# dividing the sum of the values by the number of pixels
# to get the average location
ty = int(sum(triangle_px[0])/len(triangle_px[0]))
tx = int(sum(triangle_px[1])/len(triangle_px[1]))
# print location and draw filled black circle
print("Triangle ({},{})".format(tx,ty))
cv2.circle(img, (tx,ty), 10,(0), -1)
# the same process, but now with only white pixels
white_px = np.where( img > 240)
wy = int(sum(white_px[0])/len(white_px[0]))
wx = int(sum(white_px[1])/len(white_px[1]))
# print location and draw white filled circle
print("White: ({},{})".format(wx,wy))
cv2.circle(img, (wx,wy), 10,(255), -1)
# display result
cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()