2017-01-30 9 views
0

Я пытаюсь найти 3 доминирующих цвета нескольких изображений с использованием кластеров K-mean. Проблема, с которой я сталкиваюсь, заключается в том, что K-значит также кластеризует фон изображения. Я использую Python 2.7 и OpenCV 3K-означает цветную кластеризацию - опустить фоновые пиксели с замаскированными массивами numpy

Все изображения имеют тот же серый фон следующего цвета RGB: 150,150,150. Чтобы избежать этого, K-означает также кластерный цвет фона, я создал маскированный массив, который маскирует все значения «150» пикселей из исходного массива изображений, теоретически оставляя в массиве только для не-фоновых пикселей для K-Means. Однако, когда я запускаю свой скрипт, он по-прежнему возвращает серый как один из доминирующих цветов.

Мой вопрос: Маскированный массив, способ пойти (и сделал я что-то не так), или есть ли лучшие альтернативы, чтобы каким-то образом исключить пиксели из кластеров K-средств?

Пожалуйста найти мой код ниже:

from sklearn.cluster import KMeans 
from sklearn import metrics 
import cv2 
import numpy as np 

def centroid_histogram(clt): 
    numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1) 
    (hist, _) = np.histogram(clt.labels_, bins=numLabels) 
    hist = hist.astype("float") 
    hist /= hist.sum() 
    return hist 

image = cv2.imread("test1.jpg") 
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 

h, w, _ = image.shape 
w_new = int(100 * w/max(w, h)) 
h_new = int(100 * h/max(w, h)) 
image = cv2.resize(image, (w_new, h_new)) 

image_array = image.reshape((image.shape[0] * image.shape[1], 3)) 
image_array = np.ma.masked_values(image_array,150) 

clt = KMeans(n_clusters=3) 
clt.fit(image_array) 

hist = centroid_histogram(clt) 
zipped = zip(hist, clt.cluster_centers_) 
zipped.sort(reverse=True, key=lambda x: x[0]) 

hist, clt.cluster_centers = zip(*zipped) 
print(clt.cluster_centers_) 

ответ

1

Если вы хотите, чтобы извлечь значения, отличных от фона пикселей, вы можете использовать NumPy индексацию:

img2=image_array[image_array!=[150,150,150]] 
img2=img2.reshape((len(img2)/3,3)) 

Это даст список пикселей, которые не являются [150, 150, 150].
Однако он не сохраняет структуру изображения, просто дает вам список пикселей значения. Я действительно не могу вспомнить, но, возможно, для K-означает, что вам нужно дать весь образ, т. Е. Вам также нужно будет поместить его в положение пикселей? Но в этом случае никакая маскировка никогда не поможет, поскольку маскировка просто заменяет значения определенных пикселей на другой, не избавляясь от пикселей вместе.

+0

это прекрасно работает как вход для kmeans для кластеризации цветов. не используется пространственная информация (позиции пикселей), список пикселей, создаваемых путем индексирования, является прекрасным. – welch

+0

Спасибо @welch, я не был уверен – Soltius

 Смежные вопросы

  • Нет связанных вопросов^_^