网站首页排版设计,杭州市建设信用网,设计公司起名及寓意,界面设计是什么本想大迈步进入前馈神经网络 但是…唉…瞅了几眼#xff0c;头晕 然后想到之前梳理的奇异值分解、主成分分析、CBOW都没有实战 如果没有实际操作#xff0c;会有一种浮在云端的虚无感 但是如果要实际操作#xff0c;我又不想直接调用库包 可是…如果不直接调包#xff0c;感… 本想大迈步进入前馈神经网络 但是…唉…瞅了几眼头晕 然后想到之前梳理的奇异值分解、主成分分析、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_matrices0)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)这是k1000时的对比 这是k100时的样子 K的取值范围是基于sigma奇异值的个数范围内 因此有些人为了避免自己k值设置超出范围报错可以加以限制 但我被下边的bug烦了4个小时有些气恼懒得搞了 找了4个小时的bug居然是没有将float转为整数含恨吐血
new_c new_c.astype(uint8)没有转型就会变成下边这样。。。。。鬼样