当前位置: 首页 > news >正文

机器学习——奇异值分解案例(图片压缩-代码简洁版)

本想大迈步进入前馈神经网络
但是…唉…瞅了几眼,头晕
然后想到之前梳理的奇异值分解、主成分分析、CBOW都没有实战
如果没有实际操作,会有一种浮在云端的虚无感
但是如果要实际操作,我又不想直接调用库包
可是…如果不直接调包,感觉自己又像是在造轮子造螺丝,明明别人都已经造好了,为什么还要自己造一遍呢
意义何在?
这又让我回想当初开始机器学习的初衷:消磨时间
既然初衷至今没变,那就不应该求快,应该尽可能合格专业地磨洋工
生活本就没有意义,再加快脚步,又有什么意义呢?
slow down
好叭,那就慢慢来,自己造个破破烂烂的轮子,也能敝帚自珍

通过奇异值分解,来压缩图片

这就需要opencv来获取图片的RGB信息。

import cv2
img = cv2.imread("crab.png", 1)
print(img)

首先,获取到的图片信息是个嵌套数组,一般每个像素表示一个向量,这个向量里含有RGB三个数值

获取到的颜色信息数据,是个嵌套数组,并不是奇异值分解中的标准矩阵形式
在这里插入图片描述

因此,我们需要将RGB这三个颜色通道的数据拆分开,变成三个矩阵

  • 矩阵1:表示红色通道的图片信息
  • 矩阵2:表示绿色通道的图片信息
  • 矩阵3:表示蓝色通道的图片信息
b,g,r = cv2.split(img)

算了,还是直接给出完整代码吧

import cv2
import numpy as np# 前k个sigma
k = 1000# 读取三通道颜色
img = cv2.imread("img1.png", 1)
colors = cv2.split(img)new_colors = []
for c in colors:# 奇异值分解u, sigma, v = np.linalg.svd(c, full_matrices=0)u = u[:,:k] # 获取U的前k列sigma = np.diag(sigma[:k]) # 奇异值是一个一维向量,将奇异值构造成对角矩阵v = v[:k,:] # 获取V的前k行# 组建压缩后的新矩阵a = np.matmul(u,sigma)new_c = np.matmul(a,v)"""转型!!!很重要!!!!因为矩阵计算后是float型,float型在cv2的显示有很大问题!!!!!!!!!!"""new_c = new_c.astype('uint8')new_colors.append(new_c)# 展示原图与压缩图片
cv2.imshow("img-old", cv2.merge(colors))
cv2.imshow("img-new", cv2.merge(new_colors))
cv2.waitKey(0)

这是k=1000时的对比在这里插入图片描述
这是k=100时的样子
在这里插入图片描述
K的取值范围,是基于sigma奇异值的个数范围内
因此,有些人为了避免自己k值设置超出范围报错,可以加以限制
但我被下边的bug烦了4个小时,有些气恼,懒得搞了

找了4个小时的bug!!!!!!居然是没有将float转为整数!!!含恨吐血

new_c = new_c.astype('uint8')

没有转型,就会变成下边这样,。,。。。。鬼样!!
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/227843.html

相关文章:

  • 【Go入门】面向对象
  • Asp.Net Core 中使用配置文件
  • 深入理解JVM虚拟机第二十四篇:详解JVM当中的动态链接和常量池的作用
  • QGridLayout
  • 万能在线预约小程序系统源码 适合任何行业在线预约小程序+预约到店模式 带完整的搭建教程
  • Leetcode 2935. Maximum Strong Pair XOR II
  • [直播自学]-[汇川easy320]搞起来(4)看文档 查找设备(续)
  • WebSphere Liberty 8.5.5.9 (四)
  • UE特效案例 —— 角色刀光
  • 11. EPIC定时器
  • git-bash配置代理
  • 【ElasticSearch系列-07】ES的开发场景和索引分片的设置及优化
  • JavaWeb Day09 Mybatis-基础操作02-XML映射文件动态SQL
  • CV学习基础
  • 设计模式之禅之设计模式-原型模式
  • Spring的循环依赖问题
  • RT-DETR算法改进:更换损失函数DIoU损失函数,提升RT-DETR检测精度
  • 【ICE】2:基于webrtc的 ice session设计及实现
  • Vue组件传
  • 轻量封装WebGPU渲染系统示例<25>- 颜色附件数据更新替换(源码)
  • c语言练习第11周(1~5)
  • 阿里云国际站服务器如何升级内存容量?
  • 神经网络(第二周)
  • 《网络协议》04. 应用层(DNS DHCP HTTP)
  • springboot自己添加的配置文件没有绿色叶子问题
  • 【Java】定时任务 - Timer/TimerTask 源码原理解析
  • SAP ABAP基础语法-Excel上传(十)
  • 记录一次某某虚拟机的逆向
  • upload-labs关卡7(基于黑名单的空格绕过)通关思路
  • CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。