【K_means】在矢量量化图像压缩中的应用

news2024/11/27 5:30:31

我们我们先来导入相应的模块,并看看要压缩的图片:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin
    #对两个序列中的点进行距离匹配的函数
from sklearn.datasets import load_sample_image
    #导入图片数据所用的类
from sklearn.utils import shuffle #洗牌plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('Original image (96,615 colors)')
plt.imshow(china)

我们再来看看计算机是如何读取这幅图片的:

这是一个三维数组,图片长*宽一共有640*427 = 273280个像素点,每个像素点有3个特征(颜色三通道)。在进行Kmeans聚类时我们需要把三维数组转换成二维数组:

同时删除掉重复颜色,我们发现实际上只有九万多种颜色:

因为plt.imshow在浮点数上表现非常优异,因此我们把newimage中的数据,转换为浮点数,压缩到[0,1]之间:

newimage = np.array(newimage, dtype=np.float64) / newimage.max()

因为在图像处理中,一个像素的颜色是由它的红、绿、蓝三个通道的值相对于其他像素的这些值来决定的。即使我们将所有像素通道值都除以某个数,只要它们的相对大小保持不变,图像的颜色就会看起来一样,因此不用担心颜色会变化的问题。

接下来,我们来找质心。因为数据量太大,我们随机抽取1000个样本点来聚类,剩余的样本点在质心上继续聚类。这里我们使用shuffle函数:

#首先,先使用1000个数据来找出质心
n_clusters = 64
image_array_sample = shuffle(image_array, random_state=0)[:1000]
kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(image_array_sample)

可以看到这是生成了64个质心的数据坐标,接下来我们用这64个质心去聚类全部数据:

labels的返回值是273280条数据各自聚类的质心的索引,用set()函数去重后:

接下来我们把样本点的特征都换成所在簇的质心的特征:

image_kmeans = newimage.copy()
for i in range(w*h):
    image_kmeans[i] = kmeans.cluster_centers_[labels[i]] #把所有的样本点都替换成质心

可以看到,替换过后只剩下64种独一无二的颜色了。接下来我们恢复图片的结构:

画出图片:

plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('Quantized image (64 colors, K-Means)')
plt.imshow(image_kmeans)

可以看到和原始图片相比,没有太大的区别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1160689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AD9371 官方例程裸机SW概述(一)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…

windows系统卸载mysql

1. win r 输入 control 打开控制面板 2.搜索mysql,删除搜索内容 3.删除相应路径下的mysql文件夹C:\Program Files C:\ProgramData 4.删除注册表,win r 输入 regedit 打开注册表 5.搜索MySql 删除掉 完成

Spring Cloud的ElasticSearch的进阶学习

目录 数据聚合 Bucket示例 Metric示例 RestAPI实现聚合 自动补全 使用拼音分词 自定义分词器 实现自动补全 RestAPI实现自动补全功能 数据同步 同步调用 异步通知 监听binlog 数据聚合 聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类: …

UI动效的都可以用哪些工作来制作

随着UI设计的不断发展,UI动效越来越多地应用于现实生活中。手机,iPad、计算机、网页和其他设备被广泛使用,所以问题来了,为什么UI动态效果越来越被广泛使用?它的优点是什么?哪些软件可以设计UI动态效果&…

【uniapp】html和css-20231031

我想用控件和样式来表达应该会更贴切,html和css的基础需要看看。 关于html:https://www.w3school.com.cn/html/html_layout.asp 关于css:https://www.w3school.com.cn/css/index.asp html让我们实现自己想要的布局(按钮&#xff0…

ERP源码_含vs2019版

ERP源码_含vs2019版 1、两套大型源码。 2、vs2010和vs2019。 3、sqlserver2008以上。 4、C#. 5、附带数据库,详细安装说明。 6、赠送dxdev控件。 注意, 1,2019是更新版。2010是老版本。 2,关闭桌面所有程序,安装dx控件&#xff0…

电子器件 MOS管的参数、选型与使用技巧

一、电路符号 MOS管分为 G(栅极)、S(源极)、D(漏极) 三极,在图中 S 极有两条线,D 极只有一条线。 1.1 NMOS 和 PMOS 下图中,左侧是 PMOS,右侧是 NMOS。箭头…

Flutter 02 基础组件 Container、Text、Image、Icon、ListView

一、Container容器组件: demo1: import package:flutter/material.dart;void main() {runApp(MaterialApp(home: Scaffold(appBar: AppBar(title: const Text("你好Flutter")),body: const MyApp(),),)); }// 容器组件 class MyApp extends St…

【软件安装环境配置】VScode 设置运行前清屏

在运行插件中设置 运行插件的安装参考:【软件安装&环境配置】VsCode安装和配置各种环境(保姆级)-CSDN博客 找到Code-runner: Clear Previous Output,把√打上即可 本文所涉及的他人内容包括但不限于文字、图片、音频、视频等…

OpenCV官方教程中文版 —— 图像去噪

OpenCV官方教程中文版 —— 图像去噪 前言一、原理二、OpenCV 中的图像去噪1.cv2.fastNlMeansDenoisingColored()2.cv2.fastNlMeansDenoisingMulti() 前言 目标 • 学习使用非局部平均值去噪算法去除图像中的噪音 • 学习函数 cv2.fastNlMeansDenoising(),cv2.fa…

面试算法49:从根节点到叶节点的路径数字之和

题目 在一棵二叉树中所有节点都在0~9的范围之内,从根节点到叶节点的路径表示一个数字。求二叉树中所有路径表示的数字之和。例如,图8.4的二叉树有3条从根节点到叶节点的路径,它们分别表示数字395、391和302,这3个数字…

Flutter GetX的使用

比较强大的状态管理框架 引入库: dependencies:get: ^4.6.6一.实现一个简单的demo 实现一个计数器功能 代码如下: import package:flutter/material.dart; import package:get/get.dart;void main() > runApp(const GetMaterialApp(home: Home()…

Spring MVC(Next-2)

1.视图解析器 1.视图解析器和视图 ModelAndview: 模型数据 (存储业务数据) 和视图 Model: 模型数据(存储模型层中查询到的数据) View:视图(页面属于视图中的一种) 控制单元执行完成后,无论什么类型返回值,都会封装为ModelAndview。 Mod…

C/C++指针变量详解

1、指针变量的基本操作基本操作 int a,*iptr,*jptr,*kptr; iptr &a; jptr iptr; *jptr 100; kptr NULL;图解: 1.1 己址和己空间 指针变量也是一个变量,对应一块内存空间,对应一个内存地址,指针名就是己…

OceanBase:03-集群部署

目录 一、集群规划 二、配置要求 三、部署前配置 1.配置 limits.conf 2.配置 sysctl.conf 3.关闭防火墙 4.关闭 SELinux 5.创建数据目录,修改文件所有者信息 6.设置无密码 SSH 登录 7.安装jdk 四、解压执行安装 五、集群部署 1.OBD命令行部署 2. OBD白…

实用篇-Docker容器

一、初识Docker docker 是一个开源的应用容器引擎,一个容器可以理解成一个轻量级的虚拟机,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。…

python科研绘图:条形图

条形图(bar chart)是一种以条形或柱状排列数据的图形表示形式,可以显示各项目之间的比较。它通常用于展示不同类别的数据,例如在分类问题中的不同类别、不同产品或不同年份的销售数据等。 条形图中的每个条形代表一个类别或一个数…

基于goframe2.5.4、vue3、tdesign-vue-next开发的全栈前后端分离的管理系统

goframe-admin goframe-admin V1.0.0 平台简介 基于goframe2.5.4、vue3、tdesign-vue-next开发的全栈前后端分离的管理系统。前端采用tdesign-vue-next-starter 、vue3、pinia、tdesign-vue-next。 特征 高生产率:几分钟即可搭建一个后台管理系统认证机制&#x…

TypeError: Cannot read property ‘setRules‘ of undefined“

1.uniapp 执行小程序表单校验时报错 使用如果使用v-if,则使用v-show替换v-if ,即可解决问题

使用脚本整合指定文件/文件夹,执行定制化 ESLint 命令

背景 最近面对一个庞大的项目,但是只需要修改某个模块,每次都手搓命令太麻烦了,于是就想着能不能写个脚本来辅助处理这些事情。 解决方案 定制化一键 ESLint,执行文件下载地址: https://github.com/mazeyqian/go-g…