机器学习之实战篇——图像压缩(K-means聚类算法)
机器学习之实战篇——图像压缩(K-means聚类算法)
- 0. 文章传送
- 1.实验任务
- 2.实验思想
- 3.实验过程
0. 文章传送
机器学习之监督学习(一)线性回归、多项式回归、算法优化[巨详细笔记]
机器学习之监督学习(二)二元逻辑回归
机器学习之监督学习(三)神经网络基础
机器学习之监督学习(四)决策树和随机森林
机器学习之实战篇——预测二手房房价(线性回归)
机器学习之实战篇——肿瘤良性/恶性分类器(二元逻辑回归)
机器学习之实战篇——MNIST手写数字0~9识别(全连接神经网络模型)
机器学习之非监督学习(一)K-means 聚类算法
1.实验任务
图像和实验文件打包如下:
通过百度网盘分享的文件:bird.zip
链接:https://pan.baidu.com/s/1RK1AF5iY8Pfi_tFxf-bLyw?pwd=tmdt
提取码:tmdt
2.实验思想
使用聚类算法进行图像压缩的思想:
①对于每一个像素点,表示其颜色需要存储三个颜色通道的值,每个值取值为范围0~255的整数,需要8bit(1byte)的存储空间,故对于原始图像共占128×128×1×3
=48kb的存储空间。通过图片属性可以查看其大小约为36kb,这是因为PNG 格式采用了无损压缩技术。虽然原始图像未压缩时大约占用 48 KB,但由于压缩,实际存储在计算机上的文件大小会小于这个值。
②进行图像压缩,需要减少像素点颜色的种类,本案例中假设压缩后颜色种类为16,假设用整数0~15表示每个整数可以用4bit(即0.5byte)表示,对于压缩后的图片,每个像素点只需存储相应的颜色编号,因此占据的存储空间为128×128×0.5+(16×1×3)≈ 8KB,大小仅仅是原始图像的 1 6 \frac{1}{6} 61!
③因此可以采用K-means聚类算法,数据集由包含三个颜色分量特征的128×128个像素点构成,设置目标聚类类别K=16,并使用编写的kmeans.py中的run_kMeans函数实现聚类算法。
3.实验过程
手动编写的kmeans模块,实现k-means聚类算法
#kmeans.pyimport numpy as np
import matplotlib.pyplot as plt# 计算每个数据点所归属的簇
def find_closest_centroids(X, centroids):K = centroids.shape[0]m = X.shape[0]idx = np.zeros(m, dtype=int)for i in range(m):idx[i] = np.argmin(np.sum((X[i] - centroids) ** 2, axis=1))return idx# 根据当前分类情况计算新的簇心
def compute_centroids(X, idx, K):m, n = X.shapecentroids = np.zeros((K, n))for k in range(K):cond = (idx == k)if cond.any():X_k = X[cond]centroids[k] = np.mean(X_k, axis=0)else: # 如果没有点被分配到这个簇,则随机选择一个点作为新的簇心centroids[k] = X[np.random.choice(X.shape[0])]return centroids# 随机初始化簇心
def kMeans_init_centroids(X, K):randidx = np.random.permutation(X.shape[0])centroids = X[randidx[:K]]return centroids# 成本函数
def KMeans_compute_cost(X, centroids, idx):m = X.shape[0]cost = 0for i in range(m):K_idx = idx[i]X_centroid = centroids[K_idx]cost += np.sum((X_centroid - X[i]) ** 2)return cost / m# 运行 K-means 聚类算法
def run_kMeans(X, K, max_iters=10, test_times=10):m, n = X.shapemin_cost = float('inf')best_idx = np.zeros(m)best_centroids = np.zeros((K, n))for j in range(test_times):print(f'K-Means test {j}/{test_times - 1}:')initial_centroids = kMeans_init_centroids(X, K)centroids = initial_centroidsfor i in range(max_iters):print(f' K-Means iteration {i}/{max_iters - 1}')idx = find_closest_centroids(X, centroids)centroids = compute_centroids(X, idx, K)cost = KMeans_compute_cost(X, centroids, idx)if cost < min_cost:min_cost = costbest_idx = idxbest_centroids = centroidsprint(f'cost: {cost}, min_cost: {min_cost}')return best_centroids, best_idx
导入所需模块
#导入所需模块
import numpy as np
import matplotlib.pyplot as plt
import kmeans as km
处理原始图像作为数据集
#将小鸟图读取为像素矩阵
bird=plt.imread('bird.png')
print(bird)
print(f'bird.shape:{bird.shape}')
原始小鸟彩色图片分辨率为128*128,RGB三个颜色通道值都已进行归一化处理(÷255)
注:因为png格式的图片以浮点数形式存储,而jpeg图像以整数(0~255)存储
#进行聚类之前,先将128*128*3的像素矩阵转化为(128*128=16384)*3的二维特征矩阵
bird_X=bird.reshape((128*128,3))
bird_X
运行聚类算法
K=16
color_centroids, color_idx=km.run_kMeans(bird_X,K)
使用聚类结果进行图像压缩
bird_compressed_X=color_centroids[color_idx]
bird_compressed=bird_compressed_X.reshape((128,128,3))
plt.imshow(bird_compressed)
对比压缩前后图片
# Display original image
fig, ax = plt.subplots(1,2, figsize=(8,8))
plt.axis('off')ax[0].imshow(bird)
ax[0].set_title('Original')
ax[0].set_axis_off()# Display compressed image
ax[1].imshow(bird_compressed)
ax[1].set_title('Compressed with %d colours'%K)
ax[1].set_axis_off()
#%% md

可以看到压缩后的图像大体上还是保留了原图像的主要特征,但大大节省了存储空间!
相关文章:
机器学习之实战篇——图像压缩(K-means聚类算法)
机器学习之实战篇——图像压缩(K-means聚类算法) 0. 文章传送1.实验任务2.实验思想3.实验过程 0. 文章传送 机器学习之监督学习(一)线性回归、多项式回归、算法优化[巨详细笔记] 机器学习之监督学习(二)二元逻辑回归 …...
轴承介绍以及使用
轴承(Bearing)是在机械传动过程中起固定、旋转和减小载荷摩擦系数的部件。也可以说,当其它机件在轴上彼此产生相对运动时,用来降低运动力传递过程中的摩擦系数和保持转轴中心位置固定的机件。 轴承是当代机械设备中一种举足轻重的…...
【JAVA】算法笔记
一、ArrayList ArrayList类是一个可以动态变化的数组,与普通数组的区别就是它没有固定的长度。 ArrayList<String> arrList new ArrayList<String>(); arrList.add("吐泡泡"); System.out.println(arrList.get(0)); arrList.set(0,"J…...
Gnu Radio抓取WiFi信号,流程图中模块功能
模块流程如图所示: GNURadio中抓取WiFi信号的流程图中各个模块的功能: UHD: USRP Source: 使用此模块配置USRP硬件进行信号采集。设置频率、增益、采样率等参数。Complex to Mag^2: 将复数IQ数据转换为幅度的平方。Delay…...
GO语言中make与new的区别
区别 1 make不仅分配内存,还会初始化。 new只会分配零值填充的值2make只适用slice,map,channel的数据,new 没有限制3make返回原始类型(T),new返回类型的指针(*T) 源码中定义的区别 func make(t Type,size …IntegerType) Type func new(Type) *Type f…...
安全运维类面试题
1、你熟悉哪些品牌的安全设备 答:天融信的ngfw防火墙,老牌防火墙厂商,功能比较齐全,像流量检测,web应用防护和僵木蠕等模块都有,界面是红白配色,设计稍微有点老 2、IPS用的是哪个牌子的 答&…...
STM32外设之LTDC/DMA2D—液晶显示(野火)
文章目录 显示屏有几种?基本参数控制?显存 LTDC 液晶控制器LTDC 结构框图LTDC 初始化结构体 LTDC_InitTypeDefLTDC 层级初始化结构体 DMA2D 图形加速器DMA2D 初始化结构体 要了解什么 屏幕是什么,有几种屏,有什么组成。 怎么控制,不同屏幕控…...
调试vue build之后的js文件
调试 dist 目录下的 JavaScript 文件可以按照以下步骤进行: 1. 确保 Source Maps 正常生成 确认你的构建配置中已启用 Source Maps,确保 .map 文件与构建后的 .js 文件位于同一目录。 2. 启动一个本地服务器 使用本地服务器来服务 dist 目录…...
Django一分钟:DRF快速实现JWT认证与RBAC权限校验
一、项目创建并实现JWT认证 1. 下载依赖 下载django、djangorestframework、djangorestframework_simplejwt pip install django djangorestframework djangorestframework_simplejwt2. 创建项目 启动Django项目 django-admin startproject <myproject> cd myprojec…...
面试题(六)
48、设计模式 49、继承是否会破坏封装? 继承在面向对象编程中是一个重要的概念,但它确实可能对封装产生影响,具体情况取决于如何使用继承。以下是对这个问题的分析: 封装的定义 封装是面向对象编程中的一个基本原则࿰…...
CSS 实现文本溢出省略号显示,含单行与多行文本溢出
🚀 个人简介:某大型国企资深软件研发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养ǹ…...
Redis中String命令的基础操作
文章目录 Redis中String命令的基础操作一、引言二、String类型的基础命令1、设置与获取值1.1、SET命令1.2、GET命令 2、字符串操作2.1、APPEND命令2.2、GETRANGE命令2.3、SETRANGE命令2.4、STRLEN命令 3、数值操作3.1、INCR命令3.2、DECR命令3.3、INCRBY和DECRBY命令 三、应用场…...
策略模式+模版模式+工厂模式
工厂模式: (1)避免类中出现过多的组合依赖 (2)同时减少代码中出现过多的if...else if...语句 (2)将调用者跟我们的实现类解耦 模版模式: (1)功能复用 &…...
云计算平台层(PaaS)指的是什么?常见的应用场景盘点
云计算平台层(PaaS)指的是什么?云计算平台层(PaaS),全称PlatformasaService(平台即服务),是云计算服务的一种重要模式。为用户提供了一个基于云端的开发和部署环境,允许用户开发、运…...
搜索引擎简介
搜索引擎架构 整个搜索引擎分为三个系统 爬虫系统 索引系统 线上搜素服务 爬虫系统 爬虫分为两个阶段: 第一阶段:根据目标网站的列表页,爬对应的文档 URL 第二阶段:根据文档 URL,下载文档内容 触发器࿱…...
每天认识几个maven依赖(aislib+A1TRMI+Andromda+Annogen)
十七、aislib 1、是什么? aislib用于与人工智能(AI)相关的任务。这可能包括支持机器学习、数据分析或其他 AI 功能的工具。用于集成或扩展 AI 功能到 Java 项目中。 2、有什么用? 机器学习: 提供各种机器学习算法和…...
每日算法1(快慢指针)
通过一道题来了解快慢指针 这是一道力扣的算法题,首先来读题,是删除链表的中间元素,先来分析一下题,链表一共有三种可能,第一种是空链表,第二种链表的个数是偶数,第三种是链表的个数是奇数&…...
基于RealSense D435相机简单实现手部姿态重定向
基于Intel RealSense D435 相机和 MediaPipe的手部姿态检测,进一步简单实现手部姿态与机器人末端的重定向。 假设已经按照【基于 RealSenseD435i相机实现手部姿态检测】配置好所需的库和环境,并且有一个可以控制的机器人接口。 一、手部姿态重定向介绍 …...
Linux下搭建iSCSI共享存储-Tgt
Linux下搭建iSCSI共享存储-Tgt 在Linux上使用tgt搭建iSCSI共享存储,可以实现多个客户端同时访问共享存储。 1. 安装iSCSI Target软件包 使用下面命令安装: # centos sudo yum install scsi-target-utils sudo systemctl status tgtd# ubuntu sudo ap…...
js中正则表达式中【exec】用法深度解读
exec() 是 JavaScript 正则表达式对象(RegExp)中的一个方法,用于匹配字符串中的特定模式,并返回匹配结果。它比 test() 和 match() 更强大,因为它不仅仅返回匹配成功与否,还返回匹配的具体内容及其相关信息…...
CentOS8实战:ZeroTier构建安全异地虚拟局域网
1. 为什么选择ZeroTier替代传统内网穿透方案 最近在帮朋友搭建远程办公环境时,遇到了一个典型问题:分布在三个不同物理位置的服务器需要像在同一个办公室内网那样互相访问。最初考虑使用FRP方案,但实测下来发现几个痛点:首先是带宽…...
FanControl终极指南:免费开源的风扇控制神器,轻松解决Windows散热与噪音问题
FanControl终极指南:免费开源的风扇控制神器,轻松解决Windows散热与噪音问题 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https:…...
Windows Cleaner终极指南:三步告别C盘爆红,让电脑运行如飞!
Windows Cleaner终极指南:三步告别C盘爆红,让电脑运行如飞! 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 还在为Windows系统…...
Ruby专属LLM应用框架ruby_llm:从基础集成到生产部署实战
1. 项目概述:一个为Ruby语言量身打造的LLM应用框架如果你是一名Ruby开发者,最近被各种大语言模型(LLM)的应用搞得心痒痒,但看着满世界的Python库和框架感到无从下手,那么crmne/ruby_llm这个项目可能就是你在…...
避坑指南:在Unity 2022 LTS中配置XCharts插件时遇到的3个常见问题及解决方法
Unity 2022 LTS中XCharts插件实战避坑手册 当数据可视化成为现代应用的核心需求时,Unity开发者常会选择XCharts这类开源图表插件来快速实现专业级图表展示。但在实际项目落地过程中,版本兼容性、环境配置和平台适配等问题往往会让开发进程意外卡壳。本文…...
藏文语音生成准确率从61.2%跃升至94.8%:ElevenLabs Fine-tuning私有数据集构建全流程(含217小时母语者录音标注规范)
更多请点击: https://intelliparadigm.com 第一章:藏文语音生成技术演进与ElevenLabs适配挑战 藏文作为具有复杂音节结构、声调隐含性及丰富上下文依赖的黏着语系文字,其语音合成长期受限于高质量标注语料稀缺、音素-音节映射不唯一、以及缺…...
在 1688、阿里国际站上,怎么分清哪些是真工厂、哪些是贸易商?一份采购辨别清单
跨境卖家和采购最常踩的坑,就是把贸易商当成了源头工厂。结果是:报价里多了一手差价、打样要等贸易商再转给后面的厂、出了质量问题没人能进车间整改。 平台上的"工厂认证"“源头工厂”"工厂直供"标签,看起来像是替你做了…...
【职场】职场中你可以坚强,但不必逞强
职场中你可以坚强,但不必逞强 ——写给那些咬牙撑着、却不知道为什么要撑的人我见过太多这样的人。 凌晨两点还在改PPT,眼睛里布满血丝,手边的咖啡已经凉了。有人问他"还好吗",他抬起头,挤出一个笑ÿ…...
僧伽罗文语音本地化迫在眉睫!斯里兰卡新《数字服务法》2024年10月生效前,你必须掌握的7项ElevenLabs合规配置
更多请点击: https://intelliparadigm.com 第一章:僧伽罗文语音本地化的法律动因与技术紧迫性 斯里兰卡《官方语言法》(No. 33 of 1956)及2023年修订的《国家数字包容战略》明确要求:所有面向公众的政府数字服务必须支…...
