【问题标题】:How to compare two images by memcmp which one do x-axis flip如何通过memcmp比较两张图片,哪一张做x轴翻转
【发布时间】:2016-10-18 08:12:12
【问题描述】:

我正在用 C++ 编写一个图像处理应用程序,需要比较图像。例如,我有两个数组如下:

int image1[] = {10, 20, 30, 40};
int image2[] = {40, 30, 20, 10};

我想找到一种比for 循环(如memcmp)更有效的比较方法。

【问题讨论】:

  • memcmp 最终使用循环。
  • 这两张图片相等吗?它们的尺寸 WxH 是多少?
  • 您认为这可以如何优化?如果我有两张完全相同的图像,但对于随机位置的一个像素,显然我必须在最坏的情况下搜索整个图像。您可以做的是确保以正确的方式读取数据(对于内存缓存和处理器矢量比较能力)并对其进行并行化。几纳秒的剃须。但这没有必要,如果它们不是特别大,简单地比较它们是在眨眼之间完成的。如果您需要阅读并保存它们,无论如何这将花费最长的时间。
  • @Evgeniy,图像的内容是平等的。但一个是颠倒的,镜像另一个。尺寸为 2048x2048。
  • 精确算法需要比较所有像素,因此您需要完整的图像 for-loop。但您可以先尝试比较 N 个随机(或固定位置)像素,以确定您的图像是否可能不同。如果 N 个随机像素相等 - 进行全面比较以做出最终决定。

标签: c++


【解决方案1】:

根据您的问题,不清楚您是要比较两个图像/int-arrays 是否相等,还是要检查其中一个是否是另一个的翻转版本。

在任何情况下,您都应该避免过度优化并使用像memcmp 这样的函数。从复杂性的角度来看,这与 for-loop 没有区别:将优化留给编译器,让您的代码易于阅读和维护!

要检查一个数组是否是另一个数组的翻转版本,可以使用以下代码:

int image1[] = {10, 20, 30, 40};
int image2[] = {40, 30, 20, 10};
int len = 4;
bool equal = true;
for (int i = 0; i<len; i++) {
    if (image1[i] != image2[len-i-1]) {
        equal = false;
        break;
    }
}

您可以做的其他事情是将图像哈希与图像一起存储并仅比较图像哈希。但它有一些缺点:

  1. 如果您只使用图像进行一次比较,则不会节省时间,因为散列需要读取整个数组,就像直接比较一样。
  2. 哈希不会 100% 保证您的平等,因为存在固有的冲突。它们的数量取决于所使用的散列函数的质量。
  3. 要对翻转的图像使用散列,您还需要生成图像的翻转版本的散列并将其用于比较。

【讨论】:

  • 是的,我只比较图像一次。
  • 然后坚持for循环的方法。
【解决方案2】:

你需要从某个地方获取大小,然后你可以memcmp他们:

size_t size = 4;
int image1[] = {10, 20, 30, 40};
int image2[] = {40, 30, 20, 10};
if(!memcmp(image1, image2, sizeof(int) * size))
  //equal

但请注意,在这种情况下,padding might ruin your day

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多