Получение основных цветов пикселей в изображении

#python #opencv #colors #color-detection

#python #opencv #Цвет #определение цвета

Вопрос:

Я пытаюсь получить все цвета моего изображения. Я делаю это с

 unique_rgbs = np.unique(resized_img.reshape(-1, resized_img.shape[2]), axis=0)
 

Я ожидал бы получить 6 цветов, но я получаю что-то около 2000, потому что граница между цветами не сплошная. Затем я изменил цвета своего изображения, чтобы оно имело только цвета красный [255,0,0] зеленый [0,255,0] синий [255,0,0] и желтый [0,255,255], и попытался избавиться от всех остальных цветов с помощью следующего кода

 img[img[...,0] > 128] = 255
img[img[...,0] <= 128] = 0
 
img[img[...,1] > 128] = 255
img[img[...,1] <= 128] = 0
 
img[img[...,2] > 128] = 255
img[img[...,2] <= 128] = 0
 

но это не работает. Результирующее изображение только черно-белое, а результат np.unique говорит о том, что в изображении 26 цветов.

исходное изображение

увеличено в деталях

Комментарии:

1. Если у вас есть контроль над исходным изображением, не используйте jpeg. Это приводит к потерям и может вызывать подобные артефакты. Попробуйте вместо этого использовать png.

2. Мое входное изображение — png

3. Похоже, вы поделились JPEG.

4. Является ли изображение, которым вы поделились, действительно репрезентативным для ваших изображений? Все ли изображения, которые вы хотите обработать, состоят исключительно из насыщенных основных цветов? У вас есть другие примеры?

5. @Tereza Круто, я упомянул об этом только для дальнейшего использования, поскольку исходное изображение, которое вы опубликовали, было в формате jpeg.

Ответ №1:

Кластеризация, похоже, работает в этом случае:

 import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

X = plt.imread("xGmSz.jpg").reshape(-1, 3)

# cluster pixels
N = 6
km = KMeans(n_clusters=N, init="k-means  ")
km.fit(X)
# get cluster centers
colors = km.cluster_centers_.astype(int)
plt.imshow(cen.reshape(1, N, 3))
 

Это дает:

введите описание изображения здесь

Комментарии:

1. Привет, спасибо за ответ, но дело в том, что я хочу использовать код и на других изображениях, не зная количества цветов и определяя его вручную