Сжатие нескольких изображений с помощью Kmeans Clustering - PullRequest
0 голосов
/ 02 октября 2018

Моя ошибка:

  File "C:/Users/hero/PycharmProjects/project/CompressMe.py", line 14, in 

<module>
    image = image.reshape(image.shape[0] * image.shape[1], image.shape[2])
IndexError: tuple index out of range

Я пытаюсь сжать несколько изображений, присутствующих в папке, используя алгоритм K-средних.Но я получил ошибку памяти, поэтому я использовал MiniBatchKMeans, но снова я получаю IndexError.

 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 + '.png', labels);

1 Ответ

0 голосов
/ 03 октября 2018

Мое понимание формата png состоит в том, что разные файлы png могут иметь разное количество каналов (см. https://en.wikipedia.org/wiki/Portable_Network_Graphics#Pixel_format). В случае, если вы имеете дело с изображениями в градациях серого, io.imread вернет двумерное изображение (см. документацию: http://scikit -image.org / docs / dev / api / skimage.io.html # skimage.io.imread )

Возможно, попробуйте утверждать, что размерность вашегоизображение всегда 3, используя следующее:

image = io.imread(f)
if len(image.shape) == 2: # image is grayscale
    image = image[:,:,np.newaxis] # Expand to a third dimension
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...