
假设我们有一个灰度图像(128×128或128×128像素). 我们可以使用矩阵来表示该图像. 如果我们有彩像,请使用R中的readJEPG函数读取图像r语言图像识别算法,以发现它是由三维阵列(我们经常说的三种原色: 红色,绿色,蓝色)组成的. 它具有三个矩阵,大小与图像相同,每个矩阵代表包括RGB色标的颜色值,每个像素由0-255的整数表示. 接下来,我们可以通过SVD分解矩阵,然后通过消除小的奇异值,我们可以近似矩阵,选择k的值进行矩阵逼近,即压缩原始矩阵r语言图像识别算法,并获得保留了大部分矩阵的压缩矩阵. 原始矩阵信息. 注意: 绘制奇异值图像可能有助于确定重要性显着下降的地方
假设我们选择了k的值,k =我们希望保留的奇异值的数量,我们可以通过使用SVD扩展A来生成一个新的图像矩阵(仅前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的详细原理和

library(RSpectra)
library(jpeg)
library(animation)
##灰度图片生成
png("new_picd.png")
r <- 0.299
g <- 0.587
b <- 0.114
pic <- readJPEG(sprintf("sam_d.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_picd.jpg", i))
dev.off()
##图像压缩
#设置读取路径
setwd("/Users/tyc_219/Desktop/tex")
#读取图片
wyz <- readJPEG("wyz.jpg")
#可以看出图片结构为三维矩阵
str(wyz)
#设置压缩向量
k <- seq(10, 200, 10)
png("Compresspicsd.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$d
plot(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] <- r
pics[,,2] <- g
pics[,,3] <- b
writeJPEG(pics, sprintf("picture_svd_d.png", m))
}
}
compress_jpg(wyz, k, plots = TRUE)
dev.off()
#设置生成的压缩图片路径,使用im.convert函数进行GIF图生成
bm.files <- sprintf("picture_svd_d.png", k)
im.convert(files = bm.files, output = "Compresspics.gif")
我在这里用过吴彦祖的照片:


灰度图像如下:


可以通过上述函数绘制奇异值函数图:

生成的GIF图像如下. 从GIF图像中很容易看出奇异值数量对压缩图像清晰度的影响:

我的学习受到限制. 如果有错误,我仍然希望纠正它. 如果需要转载,请注明出处. 谢谢!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-245444-1.html
么么哒哈哈
小米给送了多少钱啊