使用聚类算法进行图片压缩

假设现在我们有一张图片flower.jpg,我们希望使用聚类算法对图像进行压缩,其核心思想是:通过聚类将颜色表示数量减少。例如,传统RGB,每个通道0~255(8 bits),则可以表示16777216 (24 bits)种颜色,通过聚类可以减少到16种颜色。

Step1:

        编写函数,实现图片压缩功能,思想是将每个像素作为一个元素进行聚类,然后使用每个类别的质心数值替换原像素数据,以此减少其颜色个数。该函数参数img是图片传入的接口,因此我们需要知道变量img的数据结构

def compress_image(img, num_clusters):
    X = img.reshape(-1, 1) 
    kmeans = cluster.KMeans(n_clusters=num_clusters, n_init=4, random_state=5)
    kmeans.fit(X)
    labels =kmeans.labels_
    centroids =kmeans.cluster_centers_ 
    input_image_compressed = centroids[labels].reshape(img.shape)
    return input_image_compressed

Step2:

        创建函数去打印图片

def plot_image(img, title):
    vmin = img.min()
    vmax = img.max()
    plt.figure()
    plt.title(title)
    plt.imshow(img, cmap=plt.cm.gray, vmin=vmin, vmax=vmax)
#读入图片,设置压缩率,实现压缩
#设置图片的路径和压缩比例
input_file = "exp14flower.jpg"
num_bits = 2
if not 1 <= num_bits <= 8:
    raise TypeError('Number of bits should be between 1 and 8')
num_clusters = np.power(2, num_bits)
# 输出压缩的比例
compression_rate = round(100 * (8.0 - num_bits) / 8.0, 2)
print ("\nThe size of the image will be reduced by a factor of", 8.0/num_bits)
print ("\nCompression rate = " + str(compression_rate) + "%")
# 加载需要压缩的图片
import imageio.v2 as imageio
input_image = imageio.imread(input_file).astype(np.uint8)
# 原始图像的输出
plot_image(input_image, 'Original image')
# 压缩后的图像输出 
input_image_compressed = compress_image(input_image, num_clusters).astype(np.uint8)
plot_image(input_image_compressed, 'Compressed image; compression rate = ' 
            + str(compression_rate) + '%')
plt.show()

  • 15
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值