我是靠谱客的博主 炙热店员,最近开发中收集的这篇文章主要介绍聚类算法实现图像压缩代码解析一、文章来源二、读取图片三、压缩四、解压五、结果展示,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

代码逐句解析

  • 一、文章来源
  • 二、读取图片
  • 三、压缩
  • 四、解压
  • 五、结果展示

一、文章来源

初学聚类,觉得博主的代码写的很不错,但其中很多代码在第一遍看的时候有很多地方不理解,后查阅了很多资料,终于看明白了,于是写了一篇笔记,记录自己的学习心得,有不准确的地方,还望各位大佬们不吝赐教~
聚类算法实现图像压缩

二、读取图片

# 读取图片
import cv2
import numpy as np
from scipy.cluster.vq import kmeans2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体,最后图片边框上出现的横纵坐标值就以这种字体出现
img = cv2.imread('home.jpg')   # 读入图片,并用img表示
print(img.shape)    # 输出图片的高度、宽度、通道数。(灰图的通道数是2)彩图的通道数是3,所以shape的最后一维是3
# img.shape (720, 1280, 3)  最后一维的3表示一个三维向量,(x,y,z)分别表示RGB(红绿蓝)每种颜色的“亮度”
img_reshape = img.reshape((-1, 3))  # 只改变前两维的参数,宽设置为3,高设置-1的意思就是自动“适应”某个值,使得“面积”不变
# img_reshape.shape (921600, 3)  720*1280=921600*3

三、压缩

# 压缩
# 彩图中,每种颜色(红绿蓝)亮度都是由0-255表示的,由于256=2^8,那么在计算机中需要8bit来表示某一种颜色,三种颜色共计需要24bit来表示
# 为了把图片大小压缩成原来的1/8,那么现在三种颜色只能用3bit来表示,3bit一共能表示多少种颜色呢?是2^3=8种,故选取颜色空间的 8 个聚类中心
n_cluster = 8  # 8=2^3
# 各参数解释:1.每个像素点的元素值换为浮点 2.聚类中心数 3.初始观测值得生成
# kmeans2的参数详解:https://vimsky.com/examples/usage/python-scipy.cluster.vq.kmeans2.html
# kemans的参数详解:https://blog.csdn.net/weixin_44707922/article/details/91954734
centers, labels = kmeans2(img_reshape.astype(np.float64), n_cluster, minit='points')
# print(centers)  可见centers存放的是每个簇中心的坐标,即8个表示“质心”颜色的三维向量
# print(labels)  labels是图片从左到右,从上到下每个像素点所属的分类标签(0到7),即属于那个簇
compressed_img = np.asarray(labels)  # x = np.array(arr)或x = np.asarray(arr)都是复制arr给x,区别是前者只复制赋值时的数据,后者当arr更改时,x也会自动更改

四、解压

# 解压
recovered_img = []  # 空的recovered_img用于后面接受所有质心颜色
for i in compressed_img:    # 按照labels的顺序,即每个像素点对应的“质心”颜色,将质心颜色填入所有对应像素点
    recovered_img.append(centers[i])
recovered_img = np.asarray(recovered_img).reshape(img.shape)    # 重新塑造一下形状

五、结果展示

# 展示
plt.figure(figsize=(40, 10))    # 最后生成图片的宽和高
plt.subplot(1, 2, 1)    # 把图片分成一行两列,然后再第一个区域绘图
plt.imshow(img[:, :, ::-1])  # [:,:,::-1]是对图片颜色向量做翻转,比如某个像素点颜色向量是[a,b,c],执行后变成[c,b,a],为什么要翻转,因为第七行的cv2.imread是按BGR(蓝绿红)的顺序读取的
# 详解看:https://blog.csdn.net/u014453898/article/details/93716118
# 若将35行换成plt.imshow(img)  再plt.show,发现输出的图片和我们上传图片的颜色不一样
# 综上,建议第七行直接plt读取,然后后面输出便不需要翻转了
plt.subplot(1, 2, 2)    # # 把图片分成一行两列,然后再第二个区域绘图
plt.imshow(recovered_img.astype(int)[:, :, ::-1])   # 对图像进行处理,并显示其格式
plt.show()

在这里插入图片描述

最后

以上就是炙热店员为你收集整理的聚类算法实现图像压缩代码解析一、文章来源二、读取图片三、压缩四、解压五、结果展示的全部内容,希望文章能够帮你解决聚类算法实现图像压缩代码解析一、文章来源二、读取图片三、压缩四、解压五、结果展示所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部