【问题标题】:Minor image differences in image manipulation program图像处理程序中的微小图像差异
【发布时间】:2011-06-17 00:17:27
【问题描述】:

我已经实现了一种方法,它获取输入图像并将其围绕通过中心的垂直线翻转并将其保存到输出图像文件中。所以左边的东西变成右边的东西,反之亦然。图像看起来很棒,看起来完美翻转。然而,我们得到了它应该看起来的实际翻转图像文件,我使用终端中的 diff 实用程序来比较两者,它指出确实存在差异。使用一个名为 Kaliedoscope 的程序,我能够找出其中的区别:由于某些原因,一些像素的颜色与应有的不同。不知道为什么。我的代码甚至不操纵 RGB 值。

【问题讨论】:

  • 在进行比较之前,您是否将图像保存为有损格式,例如 .jpg?
  • 这些像素有何不同?它在人眼看来是否正确,但像素颜色的实际差异非常小?或者你能看出它们是不同的吗?
  • 您与哪些示例图像进行比较?是否有可能在翻转它们时应用了某种平滑算法——例如双线性或双三次?就计算机而言,这会稍微改变单个像素的颜色值,但对人眼来说是难以察觉的。
  • 我将它们保存为 bmp。直到我使用图像比较程序才能看到差异。..

标签: c++ image pixel


【解决方案1】:

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

如果它们不匹配,则文件->图像->文件进程正在破坏数据(可能像素成员的大小错误,导致舍入或使用未初始化的内存) 或比较器(如万花筒)错误,您只需复制输入文件并进行比较即可测试。

如果它们确实匹配,那么您的反转过程是错误的(这似乎不太可能)或参考文件(输出“应该看起来像”)是错误的,您可以通过以下方式进行测试修改代码也读入参考文件,并报告第一个不一致——即构造三个Images,Before(从输入文件中读取),After(将写入输出文件)和Reference (从参考文件中读取),然后迭代 x 和 y,比较 After(x,y) 和 Reference(x,y)。一旦发现不一致,看看哪个匹配 Before(width-x-1, y);如果 Reference 匹配,那么你的反转程序是错误的,如果 After 匹配,那么参考文件是错误的(你可以指向一个证明它的像素)。

【讨论】:

    【解决方案2】:

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

    由于您有参考图像,因此您可以准确地分辨出存在差异的像素位置。我建议您使用调试器单步执行您的程序(如果您是 Linux 用户,则使用 gdb,或者如果您喜欢使用 Visual Studio),并在代码的内部循环中的问题位置放置断点。使用这些断点,在程序中寻找问题出现的第一个点。这将帮助您找到原因。

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

    张贴图片可能会很好——你的结果和预期的参考。

    【讨论】:

      【解决方案3】:

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

      检查是否

      a == flipleft(flipleft(a)) 
      

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

      HTH!

      编辑

      还要检查图像的垂直中心,以确保当水平像素数为偶数时,您正在交换中间的两个。

      【讨论】:

      • @mohabitar 只需将您的方法再次应用于生成的图像。它应该返回原来的一次连续应用两次
      • 这意味着如果你有一个图像对象'a',并且你在它上面调用你的'flipleft'函数两次,你应该得到一个相等的图像。一些注意事项:首先,您已将其定义为方法,因此它可能更像是 == a->flipleft()->flipleft()。其次,它假设 == 比较图像,这意味着您必须编写自己的 == 运算符。相反,您应该手动比较两个图像中的像素,看看它们是否都相同。
      • @mohabitar 如果您发现它们相同,它可能会暗示(但不会确认)您的软件正在运行,并且为您提供测试解决方案的其他人做了一个(小)错误。如果你应用了两次都不匹配,那么你的代码显然有错误。
      • @mohabitar 因为通过这样做,您可以识别出下面的逻辑。并且只对一个通道(R、G 或 B)上的图像进行此操作,以探索更多。
      • @mgiuca 感谢上述 cmets。我显然不在 C++ 电路中。只是想帮助图像部分。
      【解决方案4】:

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

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

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

      【讨论】:

      • 好吧,如果您将其保存为 BMP,那么它应该是无损的(如 PNG)。假设您的问题没有问题,那么提供的解决方案或这个 Kaleidoscope 程序可能仍然存在问题。如果您安装了ImageMagick,请尝试使用convert -flop original.bmp expected.bmp,它将创建预期的输出图像,并对其进行测试。使用 ImageMagick 的“比较”程序来测试差异。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2017-01-28
      • 1970-01-01
      相关资源
      最近更新 更多