图片的基本构成

假设我们有一个灰度图像(128×128,即128×128像素)。我们可以使用矩阵来表示这个图像。如果我们有彩色图像,用R中的readJEPG函数读取图片就可以发现它是由一个三维数组构成(我们常说的三原色:Red, Green, Blue )它有三个矩阵,大小与图像相同, 每个矩阵表示包括RGB色标的颜色值,每个像素由0-255的整数表示。接下来,我们可以通过SVD分解矩阵,再通过消除小的奇异值,我们可以近似矩阵,选择k的值进行矩阵近似,也就是压缩原有矩阵,得到一个保留了原始矩阵大多数信息的压缩矩阵。注意:绘制奇异值图像可能有助于确定重要性显着下降的位置

假设我们选择了k的值,k = 我们希望保留的奇异值的数量,我们可以通过扩展A来生成新的图像矩阵一个使用SVD(第一个k,仅限奇异值)。如果要使用彩色图像,请分别对R,G,B矩阵进行重新组装。
如果你想要得到一个基于原有的彩色图片的灰度图片的话,可以采用:New.img=0.299∗r+0.587∗g+0.114∗bNew.img = 0.299 * r + 0.587 * g + 0.114 * bNew.img=0.299∗r+0.587∗g+0.114∗b的公式处理。

如果对SVD(奇异值分解)不了解的话,可以参考我另外一篇有关SVD原理的方面的文章:SVD及PCA的详细原理以及联系

R代码

library(RSpectra)
library(jpeg)
library(animation)##灰度图片生成
png("new_pic%03d.png")
r <- 0.299
g <- 0.587
b <- 0.114
pic <- readJPEG(sprintf("sam_%03d.jpg", i))
R <- pic[,,1]
G <- pic[,,2]
B <- pic[,,3]
#通过灰度进行图像转化
new_pic <- r*R + g*G + b*B
#将转化后的灰度图导出为.jpg
writeJPEG(new_pic, sprintf("new_pic%03d.jpg", i))
dev.off()##图像压缩
#设置读取路径
setwd("/Users/tyc_219/Desktop/tex")
#读取图片
wyz <- readJPEG("wyz.jpg")
#可以看出图片结构为三维矩阵
str(wyz)
#设置压缩向量
k <- seq(10, 200, 10)
png("Compresspics%03d.png")compress_jpg <- function(pic, k, plots = TRUE)
{#如果压缩向量k里面的最小值小于等于1,报错if(min(k) <= 1) stop("The minimum of the vector must larger than 1!")#svds()函数在给定的mxn矩阵A的前提下,可以找到其最大的k奇异值和相应的奇异向量svd_message <- function(jpg, i){r <- svds(jpg[,,1], i)g <- svds(jpg[,,2], i)b <- svds(jpg[,,3], i)return(list(r = r, g = g, b = b))}pic <- svd_message(pic, 200)if(plots == TRUE){sigma <- pic$r$dplot(1:length(sigma), sigma, xlab="i-th sigma", ylab="sigma", main="Singular Values")plot(1:length(sigma), cumsum(sigma)/sum(sigma), main="Cumulative Percent of Total Sigmas")}#返回在不同取值下的压缩后图片,取值越小图片约模糊for(m in k){r <- pic$r$u[, 1:m] %*% diag(pic$r$d[1:m]) %*% t(pic$r$v[,1:m])g <- pic$g$u[, 1:m] %*% diag(pic$g$d[1:m]) %*% t(pic$g$v[,1:m])b <- pic$b$u[, 1:m] %*% diag(pic$b$d[1:m]) %*% t(pic$b$v[,1:m])pics <- array(0, c(nrow(r), ncol(r), 3))pics[,,1] <- rpics[,,2] <- gpics[,,3] <- bwriteJPEG(pics, sprintf("picture_svd_%03d.png", m))}
}compress_jpg(wyz, k, plots = TRUE)
dev.off()
#设置生成的压缩图片路径,使用im.convert函数进行GIF图生成
bm.files <- sprintf("picture_svd_%03d.png", k)
im.convert(files = bm.files, output = "Compresspics.gif")

我在这里采用的是吴彦祖的照片:
其灰度图如下:

通过上面的函数可以画出奇异值函数图:

生成的GIF图如下,从GIF图很容易看出取奇异值的个数对压缩后图片清晰度的影响:

本人所学有限,如果有错误的地方还望指正,如需转载,请标明出处,谢谢!

基于R语言SVD的图像压缩方法相关推荐

  1. 基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作

    详情链接 :基于R语言.MaxEnt模型融合技术的物种分布模拟.参数优化方法.结果分析制图与论文写作 内容介绍:  第一章 .理论篇 以问题导入的方式,深入掌握原理基础 : 什么是MaxEnt模型? ...

  2. 基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

    Meta分析是针对某一科研问题,根据明确的搜索策略.选择筛选文献标准.采用严格的评价方法,对来源不同的研究成果进行收集.合并及定量统计分析的方法,最早出现于"循证医学",现已广泛应 ...

  3. 基于R语言的聚类分析(k-means,层次聚类)

    今天给大家展示基于R语言的聚类,在此之前呢,首先谈谈聚类分析,以及常见的聚类模型,说起聚类我们都知道,就是按照一定的相似性度量方式,把接近的一些个体聚在一起.这里主要是相似性度量,不同的数据类型,我们 ...

  4. r语言 线性回归 相关系数_基于R语言的lmer混合线性回归模型

    原文 基于R语言的lmer混合线性回归模型​tecdat.cn 混合模型适合需求吗? 混合模型在很多方面与线性模型相似.它估计一个或多个解释变量对响应变量的影响.混合模型的输出将给出一个解释值列表,其 ...

  5. 【R语言实验】基于R语言的时间序列平稳性检验

    一.实验项目名称:基于R语言的时间序列平稳性检验 二.实验目的与要求: 平稳时间序列的概念,平稳性检验的时序图检验方法和自相关图检验方法. 三.实验原理: 时序图和自相关图检验时间序列的平稳性依据: ...

  6. 055B ENMTools教程-基于R语言对MaxEnt模型优化-MaxEnt调参教程--更新日期2021-9

    055B-1 视频附带资料下载和密码:软件-数据-文献下载-持续更新 055B-2 ENMTools软件下载安装 055B-3 R软件和工具包安装 055B-4 生物气候因子的精度说明与选择方法(理论 ...

  7. 基于R语言混合效应模型(mixed model)案例研究

    全文链接: http://tecdat.cn/?p=2596 在本文中,我们描述了灵活的竞争风险回归模型.回归模型被指定为转移概率,也就是竞争性风险设置中的累积发生率(点击文末"阅读原文&q ...

  8. R语言做GGEbiplot_基于R语言的GGE双标图在大豆区试中的应用

    基于 R 语言的 GGE 双标图在大豆区试中的应用 * 昝 凯,陈亚光,徐淑霞 ** ,周青,张志民,杨慧凤,王凤菊,李明军,郭海芳 [摘 要] 摘要:为合理评价大豆区域试验中品系的丰产性.稳产性和适 ...

  9. 毕业论文知识点记录(六)——基于R语言优化maxent模型

    毕业论文知识点记录(六)--基于R语言优化maxent模型 第一步:R安装 这个网上都有很多详细的步骤,就不再详细介绍了. 第二步:R安装包 因为优化maxent模型需要用到kuenm程序包,但是官网 ...

最新文章

  1. 【控制】蚁群算法(ACO,Ant Colony Optimization)及 Matlab 实现
  2. Apache——启动错误:[Cannot load modules/mod_actions.so into server]解决方案
  3. 2017php行情,2017年蔬菜行情特点及未来蔬菜价格走势分析
  4. offset;scroll;client
  5. git base , 版本合并:git的分支与合并的两种方法 - 方法1:git merge
  6. android app攻击与防范论文,基于Android平台的应用程序安全保护研究与应用
  7. 力控批量添加变量_力控变量.ppt
  8. SSL/TLS 以及HTTPS 介绍
  9. JavaScript加密库Crypto-JS的使用
  10. vscode java settings设置_vscode 搭建java环境
  11. PyCharm导入selenium的webdirver模块出错
  12. 一次网站登录慢故障排查
  13. compositionAPI
  14. 2021爱分析·中国人工智能应用趋势报告——新基建助推,人工智能应用迈入新阶段
  15. 计算机电缆国家标准是什么,电线电缆国家标准-计算机电缆(电压等级:0.45/0.75KV,企标)...
  16. ORA-1653: unable to extend table by 1024 in tablespace(oracle表空间满了的解决方案)
  17. MySQL之按日期查询表数据
  18. 项目实战:51单片机无线音乐门铃设计资料 五首歌曲自由切换 (含实物 图纸 程序 仿真)
  19. outs阈值化用来二值化图像
  20. 基于深度强化学习的机器人运动控制研究进展 | 无模型强化学习 | 元学习

热门文章

  1. Couchbase 分享 PPT
  2. 商务智能(BI)技术
  3. 【Android探索】基于Android Studio平台的蓝牙遥控APP
  4. 《Android Studio开发实战》学习(一)- Hello World
  5. OpenSSL C++简单应用
  6. 【人脸表情识别】稀疏表示人脸表情识别【含GUI Matlab源码 786期】
  7. 华硕h410csm怎么开启_昂达h410主板装win7系统及bios设置教程(首发支持10代cpu)
  8. 基于嵌入式的密码访问的门锁系统
  9. halcon学习教程2-相机畸变矫正
  10. 01-计算机原理基础