查找两个图像之间的差异并更新第二个图像

时间:2010-07-29 13:30:22

标签: c# image-processing compare

  1. 如何找到2张图片之间的区别?
  2. 替换第二张图像中的差异以使两张图像完全相同?
  3. 我找到了第一部分的答案,但没有找到第一部分和第二部分的答案。

    修改

    我正在使用C#.Net

    到目前为止我找到的来源:

    但是,我如何使用这些来满足我的需求?

5 个答案:

答案 0 :(得分:1)

你确定更好的解决方案,以节省带宽,不是简单地替换图像nr。 2?

假设至少有一个图像不在本地,并且图像大小是x个字节。你有两种可能性:

  • 要比较两张图片,您必须:下载,比较它们并上传新图像。因此,您将在网络上传输 2x字节(加上计算时间)。
  • 要覆盖第二张图像,您必须:上传新图像。 网络上的x字节(并且没有计算时间)。

答案 1 :(得分:0)

如果我理解正确你有1个2个图像,另一个1个。 你想比较pc1上的图像并将差异发送到pc2?

非常有趣的任务。

唯一想到的优化算法(考虑到我不知道那种情况下的专门算法)是递归地将图像划分为四叉树,比如NE,NW,SW,SE,直到达到某个最佳阈值然后仅向图像pc2发送不同图像的节点。

例如,您有图像

0000
0010
0011
0000

您将其分为以下四叉树:

NW: 
00
00

NE:
00
10

SE:
11
00

SW:
00
00

您将以下信息发送到pc2: NE 0010 SE 1100

考虑到只需要一个字节或整数来指定四叉树中的完整路径(NW-> NE-> SW),您将发送

1(NE)+4(0010)+1(SE)+4(1100) = 10

字节信息而不是原始信息16。

如果再递归划分子树,输出带宽将是6个字节而不是16个。

答案 2 :(得分:0)

第2部分:

如果您将差异存储为透明GIF图像,该怎么办?然后,要构建最终图像,您只需在另一个图像上绘制透明GIF。

答案 3 :(得分:0)

正如其他人所说,您应该首先进行基准测试,以确保发送图像差异实际上可以节省带宽。

但是,如果您有非常大的图像且差异相对较少,则此问题看起来像是稀疏矩阵更新。

例如,如果您的差异矩阵如下所示:

0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
1 0 1 0 0
0 0 0 0 0

然后,您可以发送一系列索引以及要更新的像素数据(伪代码):

update = [[2, 3, orig_at(2, 3)], [3, 0, orig_at(3, 0)], [3, 2, orig_at(3, 2)]]

如果您的差异通常看起来像这样,则您可以使用run-length encoding(在1或2维上)进一步优化:

0 0 0 0 0
0 0 0 0 0
0 1 1 1 1
0 1 1 1 0
0 1 1 1 0

最后,如果您的差异没有“典型”形状,则this answer中的递归细分思想是一个很好的通用解决方案。

答案 4 :(得分:-1)

我已对图像差异进行了一些分析,但代码是为java编写的。请查看以下可能提供帮助的链接

How to find rectangle of difference between two images

代码找到差异并将矩形保留在Linkedlist中。您可以使用包含矩形的链接列表来修补基本图像上的差异。

干杯!