Преобразуйте изображение, чтобы использовать меньше цветов - PullRequest
0 голосов
/ 19 сентября 2019

Я выполняю задачи сегментации изображения.Я конвертирую изображения в метки, но проблема с изображениями связана с артефактом сжатия jpg, в изображениях присутствуют промежуточные цвета. Так что для изображения, которое должно иметь 4 цвета (для моего случая), они имеют много цветов.Например, на изображении ниже представлено 338 цветов: image

, которые я проверил, используя следующий код:

image = Image.open("Image_Path")
image = np.array(image)
target = torch.from_numpy(image)
h,w = target.shape[0],target.shape[1]
masks = torch.empty(h, w, dtype=torch.long)
colors = torch.unique(target.view(-1,target.size(2)),dim=0).numpy()

Чтобы решить эту проблему, япробовал этот подход, но проблема в том, что он конвертирует изображение в предварительно не определенные значения пикселей. Он преобразует вышеуказанное изображение в следующие значения пикселей -

array([[  0,   0,   0],
   [  0,   0, 254],
   [  0, 254,   0],
   [254,   0,   0]]

, что является своего родаДля меня это проблематично, потому что у меня разные изображения, и все они должны иметь одинаковые значения пикселей для каждого цвета для каждого изображения, но, используя описанный выше метод, это не то же самое для других изображений, оно может преобразовать изображение красного цвета в [255,0,0] или аналогичное другое.цвета тоже.Как это сделать?

1 Ответ

1 голос
/ 19 сентября 2019

Начиная с подхода , который вы уже попробовали (скопируйте код из этого ответа здесь для справки, модифицированный для чтения изображения ОП):

import numpy as np
from skimage import io
from sklearn.cluster import KMeans

original = io.imread('https://i.stack.imgur.com/9XMfw.png')
original = original[:,:,0:3]  # remove alpha channel
n_colors = 4

arr = original.reshape((-1, 3))
kmeans = KMeans(n_clusters=n_colors, random_state=42).fit(arr)
labels = kmeans.labels_
centers = kmeans.cluster_centers_
less_colors = centers[labels].reshape(original.shape).astype('uint8')

io.imshow(less_colors)

Цель - получить centersбыть последовательным от изображения к изображению.Мы можем сделать это, установив для каждого элемента в этом массиве либо 0, либо 255. Этот выбор будет работать только в том случае, если все входные изображения имеют одинаковые цвета, которые различимы после этого изменения.Предполагая, что все они имеют одинаковые 4 цвета, используемые на одном изображении, размещенном в вопросе, это не должно вызывать беспокойства.

Один простой способ сделать это - разделить значения на 255, округлить их, а затем умножитьснова на 255:

centers = np.round(centers/255)*255

Эта строка кода будет перед созданием less_colors.

...