图像处理程序中的小图像差异

时间:2011-01-28 03:34:58

标签: c++ image pixel

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

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

如果你的功能运作良好,它应该是它自己的反转(作为必要条件,虽然不足以证明正确性)。

检查是否

a == flipleft(flipleft(a)) 

如果您信任第三方测试软件有错误怎么办?

HTH!

修改

同时检查图像的垂直中心,确保当水平像素数为偶数时,将两者交换在中间。

答案 2 :(得分:0)

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

由于您有参考图像,因此您可以确定存在差异的精确像素位置。我建议您使用调试器(gdb,如果您是Linux用户,或者Visual Studio,如果这是浮动您的船)逐步执行您的程序,并在代码的内部循环中将断点放在问题位置。使用这些断点,查找程序中问题表现出来的第一点。这将有助于您找到原因。

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

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

答案 3 :(得分:0)

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

如果它们不匹配那么file-> Image->文件进程正在破坏数据(可能是像素成员尺寸错误,导致舍入或使用未初始化的内存)或比较器(例如Kaleidoscope)是错误的,您只需复制输入文件并进行比较就可以进行测试。

如果匹配那么您的撤销程序是错误的(这似乎不太可能)或参考文件(输出“应该看起来像”)是错误的,您可以通过改变要在参考文件中读取的代码,并报告第一个不一致 - 即构造三个Images,Before(从输入文件中读取),After(将写入输出文件)和参考(从参考文件中读取),然后迭代x和y,比较After(x,y)和Reference(x,y)。一旦发现不一致,请查看哪一个与之前匹配(width-x-1,y);如果引用匹配,那么你的反转例程是错误的,如果匹配,那么参考文件是错误的(你可以指向一个证明它的像素)。