Я пытаюсь найти доминирующие цвета на изображении, а затем перехватить наиболее доминирующий. Однако у меня возникают проблемы с типами данных. Моя формула дает наиболее доминирующий цвет, как:Добавление трехмерных массивов в numpy
color=[10,10,10] # type=numpy.ndarray ,uint8
Но это дает ошибку утверждение, когда я пытаюсь преобразовать его:
color=cv2.cvtColor(color, cv2.COLOR_BGR2HSV) #gives assertion error
Что cv2.cvtColor хочет в качестве входных данных является то, что:
color_ideal=[[[ 10, 10, 10 ]]] #type=numpy.ndarray, uint8
чтобы получить его, мне удалось манипулировать цвет как таковой:
color=np.uint8(np.atleast_3d(clr).astype(int).reshape(1,1,3))
Это кажется работает, но знаю, что я не могу добавить несколько цветов к Numpy array.Somehow, после добавления размер уменьшается до 1. Мой код:
color=np.uint8([[[]]])
for item in clt.cluster_centers_:
color=np.append(color,(np.uint8(np.atleast_3d(item).astype(int).reshape(1,1,3))))
#returns: color=[10,10,10] somehow its dimension is down to 1
Мои вопросы:
1 -Как правильно добавить данные о цвете, не теряя его размер?
2-Есть ли более простой способ справиться с этим? Я удивлен, как трудно манипулировать пользовательским цветовым пикселем.
Полный код находится здесь, в случае она помогает:
<!-- language: lang-py -->
import cv2
import numpy as np
from sklearn.cluster import KMeans
def find_kmean_colors(img,no_cluster=2):
clt = KMeans(no_cluster).fit(img)
return clt
def initialize(img='people_frontal.jpg'):
img=cv2.imread('people_frontal_close_body.jpg')
img=cv2.bilateralFilter(img,9,75,75)
return img
img=initialize()
img_hsv =cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
img_list= img.reshape((img.shape[0] * img_hsv.shape[1], 3))
clt=(find_kmean_colors(img_list,1))
color=np.uint8([[[]]])
for i in clt.cluster_centers_:
color=np.append(color,(np.uint8(np.atleast_3d(i).astype(int).reshape(1,1,3))))
#color=np.uint8(np.atleast_3d(clt.cluster_centers_).astype(int).reshape(1,1,3))
up=cv2.cvtColor(color,cv2.COLOR_BGR2HSV)
Повторяющееся 'append' медленно. Сначала введите пустой массив нужного размера и вставьте значения в нужные места. Или создайте его со всем новым материалом и «соедините» его в правильном измерении. – hpaulj