基于Python查看SVD压缩图片的效果
来源:互联网 发布:美国租车软件 编辑:程序博客网 时间:2024/04/28 04:07
基于Python查看SVD压缩图片的效果
标签: Python 机器学习
机器学习中常用的降维方法是主成分分析(PCA),而主成分分析常用奇异值分解(SVD)。那么SVD的效果到底如何呢?SVD常用来进行图像的压缩,我们就来实验一下。
用到的包:
- PIL
- numpy
实验
载入一张彩色图片,分别对其RGB通道进行SVD分解。奇异值的占比公式为:
分别取和占比为[0.1, 0.2, …, 0.9]的前K个奇异值,进行图片的恢复操作。
from PIL import Imageimport numpy as npdef rebuild_img(u, sigma, v, p): #p表示奇异值的百分比 print p m = len(u) n = len(v) a = np.zeros((m, n)) count = (int)(sum(sigma)) curSum = 0 k = 0 while curSum <= count * p: uk = u[:, k].reshape(m, 1) vk = v[k].reshape(1, n) a += sigma[k] * np.dot(uk, vk) curSum += sigma[k] k += 1 print 'k:',k a[a < 0] = 0 a[a > 255] = 255 #按照最近距离取整数,并设置参数类型为uint8 return np.rint(a).astype("uint8")if __name__ == '__main__': img = Image.open('test.jpg', 'r') a = np.array(img) for p in np.arange(0.1, 1, 0.1): u, sigma, v = np.linalg.svd(a[:, :, 0]) R = rebuild_img(u, sigma, v, p) u, sigma, v = np.linalg.svd(a[:, :, 1]) G = rebuild_img(u, sigma, v, p) u, sigma, v = np.linalg.svd(a[:, :, 2]) B = rebuild_img(u, sigma, v, p) I = np.stack((R, G, B), 2) #保存图片在img文件夹下 Image.fromarray(I).save("img\\svd_" + str(p * 100) + ".jpg")
效果
一共10张图,从上到下奇异值和占比为[0.1, 0.2, …, 0.9, 1.0],奇异值和占比[0.7, 0.8, 0.9]的恢复图像还是比较清楚,然而对应的奇异值个数却非常少,如下表所示:
小结
- 奇异值分解能够有效的降低数据的维数,以本文的图片为例,从450维降到149维后,还保留了90%的信息
- 虽然奇异值分解很有效,但是不能滥用,一般情况下要求降维后信息的损失度不能超过5%,甚至是1%
- Ng的视频中提到常见的错误使用降维的情况,在这里也贴出来:
- 使用降维解决过拟合问题
- 不论什么情况,先用降维处理一下数据,即把降维当做模型训练的必须步骤
0 0
- 基于Python查看SVD压缩图片的效果
- 基于奇异值分解(SVD)的图像压缩
- 推荐算法:基于svd的算法:svd
- 机器学习实战笔记——基于SVD的图像压缩
- 机器学习笔记(二)矩阵和线性代数 例:用Python实现SVD分解进行图片压缩
- Android webview实现上传图片的效果(图片压缩)
- 网站图片查看效果
- 百度云盘上的图片,怎么查看缩略图?即查看效果
- 基于jQuery的图片放大效果
- 基于Jquery的图片切换八种效果效果
- [Python]图片压缩
- 基于Python的图像手绘效果
- Lingo:基于SVD的聚类算法
- 推荐算法:基于svd的算法:比较
- 基于DWT-SVD数字水印的畅想
- 基于GDI图片压缩算法
- Qt:使用基于zopfli的PNG图片压缩库
- 基于vue的移动端图片裁剪压缩处理
- Keil中的环境变量和使用
- 多线程编程学习总结
- Java多线程讨论 (r)
- titanic prediction
- POJ 2449 Remmarguts' Date(A*+第k短的路)
- 基于Python查看SVD压缩图片的效果
- 51nod oj 1678 lyk与gcd 【容斥定理+打表】
- Codevs 1535 封锁阳光大学
- startActivityForResult
- 堆排序的模板
- UUID 和 UDID的区别
- 关于多线程编程您不知道的 5 件事 (r)
- 周记<From 2016/8/24 to 2016/8/30>
- AndroidStudio通过ndk使用第三方动态链接库