ValueError: x должен состоять из векторов длины 3, но имеет форму (480, 640, 4) - PullRequest
0 голосов
/ 27 мая 2018

У меня есть этот код, который уменьшает цвет до минимального количества цветов, чтобы помочь определить, что это такое;раньше он работал, но теперь он говорит:

ValueError: x must consist of vectors of length 3 but has shape (480, 640, 4)

Как я уже говорил, раньше он работал, но потом я попытался добавить «белый», потому что белый становится желтым, и теперь он вообще не работает

import numpy as np

from matplotlib import colors
from scipy.spatial import cKDTree as KDTree
from scipy.misc import face
from PIL import Image

REDUCED_COLOR_SPACE = True

# borrow a list of named colors from matplotlib
if REDUCED_COLOR_SPACE:
    use_colors = {k: colors.cnames[k] for k in ['red', 'green', 'blue', 'black', 'yellow', 'purple']}
else:
    use_colors = colors.cnames

# translate hexstring to RGB tuple
named_colors = {k: tuple(map(int, (v[1:3], v[3:5], v[5:7]), 3*(16,)))
                for k, v in use_colors.items()}
ncol = len(named_colors)


if REDUCED_COLOR_SPACE:
    ncol -= 1
    no_match = named_colors.pop('purple')
else:
    no_match = named_colors['purple']

# make an array containing the RGB values 
color_tuples = list(named_colors.values())
color_tuples.append(no_match)
color_tuples = np.array(color_tuples)

color_names = list(named_colors)
color_names.append('no match')

# get example picture
img = Image.open('apple.png')

# build tree
tree = KDTree(color_tuples[:-1])
# tolerance for color match `inf` means use best match no matter how
# bad it may be
tolerance = np.inf
# find closest color in tree for each pixel in picture
dist, idx = tree.query(img, distance_upper_bound=tolerance)
# count and reattach names
counts = dict(zip(color_names, np.bincount(idx.ravel(), None, ncol+1)))

print(counts)

import pylab

pylab.imshow(img)
pylab.savefig('apple.png')
pylab.clf()
pylab.imshow(color_tuples[idx])
pylab.savefig('minimal.png' if REDUCED_COLOR_SPACE else 'reduced.png')

Он работал до:

Before

И работал после:

After

Проблема в следующем:
Когда я запускаю его, я получаю эту ошибку

'строка 45, в dist, idx =tree.query (img, distance_upper_bound = допуска)
Файл "ckdtree.pyx", строка 754, в scipy.spatial.ckdtree.cKDTree.query
ValueError: x должен состоять из векторов длины 3, но имеет форму (480, 640, 4) '

Я ожидаю, что он сделает снимок, который я выбрал, и изменит его, как в примере, который я опубликовал выше.

Как я могу это реализовать?

1 Ответ

0 голосов
/ 27 мая 2018

Полученная ошибка не требует пояснений.Это означает, что ваше изображение находится в режиме RGBA, то есть в нем есть альфа-канал, поэтому его форма равна (640, 480, 4), а каналы - R, G, B, A .

* 1006.Как говорится, вам сначала нужно конвертировать ваше изображение в RGB:
img = img.convert("RGB")

Затем я экспериментировал с этой проблемой, и единственный способ найти ее - это конвертировать.ваши цвета в uint8 формат:

Измените эту строку:

color_tuples = np.array(color_tuples)

на:

color_tuples = np.array(color_tuples).astype('uint8')

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...