试图压缩图像时出现彩色像素(包括图片)

我试图使用奇异值分解压缩给定的图像。 我想我已经拥有了它,直到我注意到我在整个过程中不断出现垃圾颜色的像素。

垃圾像素

右上角显示的数字显示了0是原始图像的迭代次数。

这是一个常见的错误? 有什么我失踪?

我认为这可能与我的数学本身有关。 我正在使用JAMA,这是一个为我处理这个问题的java矩阵包。 以下是我对每个迭代的实现:

for (int i = 0; i < k; i++) {    
    Matrix step = (uColumns[i].times(sValues[i])).times(vColumns[i].transpose());
    encoded = encoded.plus(step);
}

基本上我在做什么(或试图做)是:

M = M + (s1*u1*v1^t)

我的执行过程中是否存在明显的错误,或者错误可能是由于JAMA执行SVD的方式? 从我测试的结果来看,矩阵U和V中的值的符号与Wolframalpha或Matlab生成的行有所不同。

任何帮助表示赞赏。

谢谢,

瑞斯蒂昂


这是你的图片分解成主要颜色:

Lena SVD分解为RGB

显然,你正在将颜色转换为数字和数字以错误的方式。 您将int RGB像素视为单个数值并将其传递给SVD数值过程,但实际上RGB的信息已丢失。

大多数有损图像压缩方法通过丢弃低有效位来实现压缩。 但是,如果在单个int中有RGB,则每个R,G和B的低有效位与高有效位交错。 当将像素作为单个数值传递时,该信息丢失,并且SVD过程有效地将低显着性R位解释为比高显着性G位更重要,并且可能试图完全丢弃所有G和B位,因为它们完全是因为它们在“R位之后”存储。

例如,浅灰色像素(192,192,192)的RGB值为0xC0C0C0。 以1%的错误压缩此值可能会产生,例如,0xC2AE32。 从压缩算法的角度来看,这个值只比原始数据大1%,几乎不明显。 但将其转换回RGB(194,174,50)。 R组件确实几乎相同,但G和B已损坏。 这是程序中“垃圾颜色”的来源。 分解图像显示R分量被正确压缩,G分量在高压缩级别变成随机噪声,并且B分量总是随机的。

实施中的另一个问题是散射在黑暗区域的单个亮点。 这些显然是由数字溢出和下溢造成的。 例如,黑色像素(0,0,0)被编码为0x000000 = 0; 有损压缩会引入一个小错误,可能是正数或负数,并且可能产生-1 = 0xFFFFFFFF; 在RGB中它变成(255,255,255),它是白色的。

该怎么办?

如果您只是测试SVD图像压缩并且足够使用灰度图像,则应该简单地从RGB值中取低位字节,范围从0到255.相应地,显示结果或写入输出文件时,将此值解释为灰度,或乘以0x010101以获得完整的RGB值。

如果您需要压缩彩色图像,则应在R,G和B组件上分别运行SVD算法。 这是处理颜色最简单的方法,但不是最有效的方法。 要获得更高的压缩率和不明显的伪影,最好从RGB转换为Lab(亮度和两个色度通道); 色度可以被压缩得更多,这就是JPEG的工作方式。

在对图像进行解压缩之后,在计算SVD的值之后但在将其显示在屏幕上或写入文件之前,请将所有结果值(R,G和B)限制在0-255范围内。 这将消除散落的白点。

链接地址: http://www.djcxy.com/p/49103.html

上一篇: Colored Pixels Appearing When Trying to Compress Image (pics included)

下一篇: How do we decide the number of dimensions for Latent semantic analysis ?