- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用奇异值分解来压缩给定图像。我以为我明白了,直到我注意到我在整个过程中不断出现乱七八糟的彩色像素。
右上角显示的数字表示迭代次数,其中 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 生成的值的符号不同。
感谢任何帮助。
谢谢,
贾斯蒂安
最佳答案
这是分解成原色的图片:
显然,您以错误的方式将颜色转换为数字以及将数字转换为颜色。您将 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(亮度和两个色度 channel );色度可以压缩得更多,这就是 JPEG 的工作方式。
解压缩图像时,在从 SVD 计算值之后但在将它们显示在屏幕上或写入文件之前,将所有结果值(R、G 和 B)限制在 0-255 范围内。这将消除分散的白点。
关于java - 尝试压缩图像时出现彩色像素(包括图片),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9671186/
说真的,你怎么能在不发疯的情况下处理所有这些异常呢?我是不是读了太多关于异常处理的文章或什么?我尝试重构了几次,但每次似乎都以更糟糕的结果告终。也许我应该承认确实会发生异常(exception)情况,
背景 两者 try/rescue和 try/catch是 Elixir 中的错误处理技术。根据 corresponding chapter在介绍指南中。 Errors can be rescued u
每当我尝试在 Raspberry PI 上运行此 python 脚本时,我都会遇到问题: import socket import sys # Create a TCP/IP socket sock
我想知道一些关于 PHP 的 try , catch声明。 让我们考虑以下示例。 abstract class ExceptionA extends Exception {} class Except
我的 laravel v5.4 项目中有两个模型,user 和 admin。 在 config/auth.php 中,我向守卫和提供者添加了管理员,如下所示: 'guards' => [ 'w
try: r = requests.get(url, params={'s': thing}) except requests.ConnectionError, e: print e
我有以下代码。 但是,它并不能捕获所有错误,而我仍然会收到“throw er;//未处理的'错误'事件”。 为什么是这样? app.post('/api/properties/zip/:zip/bed
问题与细节 我正在使用自定义错误处理,遇到的错误之一是“路径中的非法字符”。我有一个自定义函数,旨在通过路径字符串查找此类非法字符,并在找到它们时引发自定义错误。但是我发现,取决于非法字符,Test-
This question already has answers here: How do I catch a numpy warning like it's an exception (not j
我正在使用其他人的代码,但我不熟悉try/catch,因此我举了一个类似的小例子。在第11行上,如果我写了error(''),似乎没有发现错误并增加了索引j。但是,编写error(' ')或error
我在我的一个程序中遇到了这个问题,在这种情况下,尝试/异常(exception)的错误使程序变得更好,以防用户意外输入了他们不应该输入的内容。它仍然给我错误,我为为什么感到困惑。如果对我的问题确实很重
我在尝试TRY ... CATCH块时遇到问题。有人可以解释为什么以下代码无法执行我的sp吗? DECLARE @Result int SET @Result = 0 BEGIN TRY SE
我有一个相当大的 powershell 脚本,其中包含许多(20 多个)执行各种操作的函数。 现在所有代码实际上都没有任何错误处理或重试功能。如果某个特定的任务/功能失败,它就会失败并继续。 我想改进
为什么我尝试时需要导入 inputmismatchException catch(InputMismatchException e){ System.out.println("
我对此感到困惑 - 我为辅助方法编写了一个 try/catch 。它的目的是捕获任何无效输入(任何不是“男性”或“女性”的内容(没有特定情况)。如果输入无效,它将通知用户,然后让他们重试。如果有效,则
我有时会发现自己处于如下场景。尽可能简单地陈述问题 “有时我会创建一段代码,Java 让我将其包含在 try/catch 语句中。我没有使用 catch,所以我将其留空。为什么这是错误的?” boo
我有点困惑为什么当我不使用 Try block 时会出现 Try block 错误。 我在代码块底部附近收到错误通知。如果我不使用 try/catch,有人可以向我解释为什么会发生这种情况吗? 它是否
我已经盯着我的电脑两个小时了,我不知道我做错了什么。谁能帮助我看到光明? package blackjack; import java.util.Random; import java.util.Sc
我想将方法保存在 Enum 中,但 Class.getDeclaredMethod 抛出 NoSuchMethodException,那么我该如何处理呢?我的代码: public enum Car
这个问题已经有答案了: Executing multi-line statements in the one-line command-line (18 个回答) 已关闭 3 年前。 如何使用try.
我是一名优秀的程序员,十分优秀!