Изображение в градациях серого, полученное после сжатия изображения
Я выполняю сжатие изображений, используя алгоритм кластеризации K. Изображения, полученные после сжатия, являются оттенками серого. Как получить цветное изображение с качеством, аналогичным оригиналу?
import os
from skimage import io
from sklearn.cluster import MiniBatchKMeans
import numpy as np
algorithm = "full"
for f in os.listdir('.'):
if f.endswith('.png'):
image = io.imread(f)
rows = image.shape[0]
cols = image.shape[1]
image = image.reshape(image.shape[0] * image.shape[1], image.shape[2])
kmeans = MiniBatchKMeans(n_clusters=128, n_init=10, max_iter=200)
kmeans.fit(image)
clusters = np.asarray(kmeans.cluster_centers_, dtype=np.uint8)
labels = np.asarray(kmeans.labels_, dtype=np.uint8)
labels = labels.reshape(rows, cols);
# np.save('codebook'+f+'.npy', clusters)
io.imsave('compressed_' + f , labels);
1 ответ
Решение
Вы можете эффективно конвертировать labels
в цветное изображение через трансляцию Numpy, как это clusters[labels]
,
демонстрация
from skimage import io
from sklearn.cluster import MiniBatchKMeans
import numpy as np
import matplotlib.pyplot as plt
image = io.imread('https://stackru.com/images/6bf3550115b87a636cbd3288fb5977f260441a5c.jpg')
rows = image.shape[0]
cols = image.shape[1]
pixels = image.reshape(image.shape[0] * image.shape[1], image.shape[2])
kmeans = MiniBatchKMeans(n_clusters=128, n_init=10, max_iter=200)
kmeans.fit(pixels)
clusters = np.asarray(kmeans.cluster_centers_, dtype=np.uint8)
labels = np.asarray(kmeans.labels_, dtype=np.uint8).reshape(rows, cols)
colored = clusters[labels]
d = {'Image': image, 'Labels': labels, 'Colored': colored}
fig, ax = plt.subplots(1, 3)
for i, name in enumerate(d):
cmap = 'gray' if d[name].ndim == 2 else 'jet'
ax[i].imshow(d[name], cmap=cmap)
ax[i].axis('off')
ax[i].set_title(name)
plt.show(fig)