压缩后.jpg和.jpeg的大小增加

时间:2018-11-19 07:20:21

标签: python k-means image-compression

我正在尝试使用K-means算法压缩图像,但是压缩后某些.jpg图像的大小有所增加。如何处理.jpg和.jpeg图片。在应用压缩之前,我已经将jpg和jpeg图像保存为png格式

for f in os.listdir('.'):
    if f.endswith('.png'):
        image = io.imread(f,0)
        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)
        labels = labels.reshape(rows, cols)
        colored = clusters[labels]

        #  np.save('codebook'+f+'.npy', clusters)
        io.imsave('compressed_' + f, colored)

        img1 = mpimg.imread(f,0)
        img2 = mpimg.imread('compressed_' + f,0)
        fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 10))
        ax1.imshow(img1)
        ax1.set_title('Original image')
        ax2.imshow(img2)
        ax2.set_title('Compressed image')
        plt.show()

        fig, ax = plt.subplots(2, 1)

        img = cv2.imread(f, 0)
        ax[0].hist(img.ravel(), 256, [0, 256]);
        ax[0].set_title("Original image")
        img1 = cv2.imread('compressed_' + f,0)
        ax[1].hist(img1.ravel(), 256, [0, 256]);
        ax[1].set_title("Compressed image")
        plt.show()

        print('size of original image: ', int(os.stat(f).st_size / 1024), 'kB')
        print('size of compressed image:', int(os.stat('compressed_' + f).st_size / 1024), 'kB')

enter image description here

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的方法,则可以使用K均值聚类通过找到相似颜色像素的区域(簇)并将它们分组在一起来减少图像中的颜色数量。

尽管从理论上讲这可以减少图像的文件大小,但由于jpeg对缩小的图像应用了完全不同的图像压缩算法,因此再次将其保存,这不能充分利用具有锐利边缘的相同颜色的大区域。它必然会“模糊”图像,在某些情况下,甚至可能导致文件大小增加。

尝试以其他格式(例如,png文件)存储缩小后的图像,该格式可以利用较大的均匀颜色区域。