基于Python查看SVD压缩图片的效果

 基于Python查看SVD压缩图片的效果

机器学习中常用的降维方法是主成分分析(PCA),而主成分分析常用奇异值分解(SVD)。那么SVD的效果到底如何呢?SVD常用来进行图像的压缩,我们就来实验一下。

用到的包:

PIL

numpy

实验

载入一张彩色图片,分别对其RGB通道进行SVD分解。奇异值的占比公式为:

分别取和占比为[0.1, 0.2, …, 0.9]的前K个奇异值,进行图片的恢复操作。
from PIL import Image
import numpy as np

def 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]的恢复图像还是比较清楚,然而对应的奇异值个数却非常少,如下表所示:

奇异值和占比 奇异值个数 奇异值个数占比
0.7   45   0.10  
0.8   73   0.16  
0.9   149   0.33  
1.0   450   1.00  

 基于Python查看SVD压缩图片的效果

小结

奇异值分解能够有效的降低数据的维数,以本文的图片为例,从450维降到149维后,还保留了90%的信息

虽然奇异值分解很有效,但是不能滥用,一般情况下要求降维后信息的损失度不能超过5%,甚至是1%

Ng的视频中提到常见的错误使用降维的情况,在这里也贴出来:

使用降维解决过拟合问题
不论什么情况,先用降维处理一下数据,即把降维当做模型训练的必须步骤

用户喜欢...

使用 Micro Python 快速开发基于实时微控制器的应用程序

实时嵌入式系统变得非常复杂,不仅要深入了解复杂的 32 位微控制器,还要了解传感器、算法、因特网协议以及各种不同的终端用户应用。随着开发周期缩短和功能增多,开发团队需要设法加...


基于STM32的高性能低功耗人机界面系统设计

本文选用了意法半导体公司基于ARM最新Cortex—M3内核的STM32F103RB作为主控芯片,通过选择合适的液晶模块,构建了一个高性能低功耗的中文人机界面系统。 1、系统的工作原理 本系统以STM32F1...


基于MSP430的电机功率因数的测量系统

计算机技术,尤其是单片机技术和大规模集成电路及各种新型传感元件的迅速发展和日臻成熟,微机技术在电力系统中的普及应用,使电力系统的测量和监控技术得到了快速的发展。在工业生...


一种基于总线的智能型执行器系统设计

在自动控制系统中,执行器同控制器或控制系统相连,共同实现对工业过程的控制。现场总线是过程控制技术、仪表工业技术和计算机网络技术三大技术领域相结合的产物。WorldFIP现场总线既...


基于Docker持续交付平台建设的实践

本文是五阿哥运维技术团队针对Docker容器技术在如何在持续交付过程中探索和实践,目前已经将发布部署权限开放给...


Edico Genome推出基于AWS EC2 F1实例的基因组分析应用

Edico Genome公司之前就曾开发出了基因组分析算法,为了实现算法加速,该公司原本打算开发一个ASIC(精简指令集)处理器,但是这种方案灵活性太差,尤其是随着算法的更新,计算性能需求...


AdaBox003 ESP8266 基于 Feather 平台的物联网套件

AdaBox003 ESP8266 基于 Feather 平台的物联网套件 Adafruit 的物联网世界由 Digi-Key 策划 ADABOX003 是特别针对喜爱制作电子产品,尤其对物联网 (IoT) 世界感兴趣的初学者而推出的。Adafruit与 Digi-Key 合作,...


盘点·GitHub最著名的20个Python机器学习项目

开源是技术创新和快速发展的核心。这篇文章向你展示Python机器学习开源项目以及在分析过程中发现的非常有趣的见解和趋势。 我们分析了GitHub上的前20名Python机器学习项目,发现scikit-Lear...


Python基础语法-常量与变量

Python是一门强类型的动态语言。 字面常量,变量没有类型,变量只是在特定的时间指向特定的对象而已,变量所指向的对象是有类型的。 变量:变量在赋值时被创建,它可以是任何对象的引...


基于台达PLC嵌入型变频器汽车空调

汽车空调系统是实现对车厢内空气进行制冷、加热、换气和空气净化的舒适性装备。它可以为乘车人员提供舒适的乘...


贸泽开售Murata基于nRF52的WSM-BL241 蓝牙 5 模块

低功耗和高处理能力让物联网设计再上一个台阶 最新半导体和电子元件的全球授权分销商贸泽电子(Mouser Electronics) 即日起备货Murata的WSM-BL241 蓝牙®低功耗模块。WSM-BL241基于Nordic nRF52832片上系...


恒扬数据携手OpenPOWER多家成员共同推进基于CAPI SNAP框架的FPGA加速应用开发

日前,以“智慧链接新智能 创新加速助中国” 为主题2017年OpenPOWER 中国高峰论坛在京隆重召开,包括IBM、赛灵思、英伟达、浪潮、中太服务器、恒扬数据等在内的联盟成员出席了此次盛会并...


英国伯明翰大学团队使用Theano,Python,PYNQ和Zynq开发定点Deep Recurrent神经网络

可编程逻辑(PLD)是由一种通用的集成电路产生的,逻辑功能按照用户对器件编程来确定,用户可以自行编程把数字系统集成在PLD中。经过多年的发展,可编程逻辑器件由70年代的可编程逻辑阵...


让技术加码智慧课堂,英特尔携手东方中原推出基于OPS电子白板一体机

今日,英特尔携手合作伙伴东方中原在第73届中国教育装备展示会上召开新闻发布会,共同推出基于OPS产品形态下的新...


基于AT89S52单片机的智能数字电子时钟设计

(1)数字钟实现对年、月、日、时、分、秒、星期显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带...


【活动】《MicroPython入门指南》正式出版了,进微信群一起交流!

第一本专门介绍MicroPython的中文图书《MicroPython入门指南》由电子工业出版社正式出版了。 《MicroPython入门指南》 作者:邵子扬 MicroPython是近年开源社区中最热门的项目之一,它功能强大,使...