2011-01-28 249 views
1

我已经实现了一种方法,该方法将输入图像翻过垂直线并穿过中心并将其保存到输出图像文件。所以左边的是什么在右边,反之亦然。图像看起来很棒,看起来很完美。但是,我们给出了它应该看起来像的实际翻转图像文件,并且我在终端中使用了diff实用程序来比较这两个图像,并指出确实存在差异。使用一个名为Kaliedoscope的程序,我能够发现不同之处:有一些像素由于某种原因被染成与它们应该不同的颜色。不知道为什么。我的代码甚至不会操纵RGB值。图像处理程序中的微小图像差异

+3

在进行比较之前,您是否将图像保存为有损格式,如.jpg? – 2011-01-28 03:38:44

+0

这些像素有何不同?它对人眼来说看起来是否合适,但是像素的颜色有很小的实际差异?或者你能否告诉他们不同? – mgiuca 2011-01-28 03:41:23

+0

你比较哪些样本图像?例如,是否有可能在翻转时使用某种平滑算法 - 双线性或双三次?就计算机而言,这会稍微改变单个像素的颜色值,但对人眼而言是不可感知的。 – 2011-01-28 03:45:51

回答

1

你保存为什么图像格式?如果您使用了有损压缩(如JPEG),则图像颜色将总是略有不同,因为它们已被重新压缩。您应该使用非有损格式,例如PNG。

您也不应该使用'diff'来查看图像。我不知道万花筒是什么,但ImageMagick的“比较”工具适合查看两幅图像之间的差异。 'diff'几乎总是会告诉你两个图像之间存在差异,即使它们是相同的,而且您使用的是非有损格式,因为当您重新压缩它时,它可能会使用不同的压缩技术。

另外,你说你给了翻转的图像文件(假设这是一个家庭作业)。在这种情况下,生成该文件的人有可能犯了错误(例如,使用有损压缩)。在这种情况下,我不会担心细微的像素差异。

0

如果你的函数运行良好,它应该是它自己的逆(作为一个必要条件,尽管不足以证明正确性)。

检查

a == flipleft(flipleft(a)) 

如果你所信任的第三方测试软件存在bug?

HTH!

编辑

同时检查图像的垂直中心,可以肯定的是,当水平像素数为偶数,你在中间交换两种。

0

你的代码似乎没有任何明显的错误。

由于您有参考图像,因此您可以告诉精确像素位置哪里存在差异。我建议你用调试器(gdb,如果你是一个Linux用户,或Visual Studio,如果这是漂浮你的船)通过你的程序,并在问题位置的代码内循环中放置断点。使用这些断点,找出程序中出现问题的第一点。这将帮助您找到原因。

处理较小的图像(每次迭代时可以打印到命令行的内容,例如8x8像素)可能会为您节省一些调试时间。

发布图像可能会很好 - 您的结果和预期的参考。

0

修改您的代码,以便将输入图像读入Image,然后将其写入输出文件(无反转)并将输入文件与输出文件进行比较。

如果它们不匹配那么文件 - >图像 - >文件进程正在破坏数据(可能是像素成员大小错误,导致四舍五入或使用未初始化的内存)或比较器(例如万花筒)是错误的,您可以通过复制输入文件和比较来进行测试。

如果它们匹配那么无论你的逆转过程是错误的(这似乎不大可能)或参考文件(该文件输出“应该看起来像”)是错误的,你可以通过改变代码来测试请参阅参考文件,并报告第一个分歧 - 即构造三个Images,Before(从输入文件读取),After(将写入输出文件)和Reference(从参考文件),然后遍历x和y,比较After(x,y)和Reference(x,y)。只要你发现不一致,看看哪一个匹配Before(width-x-1,y);如果引用匹配,那么你的反转例程是错误的,如果匹配后参考文件是错误的(你可以指向一个像素来证明它)。