在图像中查找更新的矩形

时间:2012-11-05 12:27:04

标签: algorithm image-processing graphics

我需要找到两个图像之间更新的矩形区域。例如,我有这些图像:

first http://storage.thelogin.ru/stackoverflow/find-updated-rectangles-in-image/1.png second http://storage.thelogin.ru/stackoverflow/find-updated-rectangles-in-image/2.png

Imagemagick的compare告诉我这些像素已更新:

compare http://storage.thelogin.ru/stackoverflow/find-updated-rectangles-in-image/3.png

所以我需要重新绘制这些区域(已经概述了第一个区域):

compare http://storage.thelogin.ru/stackoverflow/find-updated-rectangles-in-image/4.png

重绘是通过慢速连接(57600波特)完成的,因此第一优先级是数据大小(魔术字一个字节,校验和一个字节,区域坐标六个字节,每个像素两个字节)。我可以使用哪种算法来查找这些区域?我认为,类似的东西在vnc和类似的软件中使用。

1 个答案:

答案 0 :(得分:4)

就像ImageMagick为您所做的那样,实际找到已发生变化的区域时,您可以计算逐像素差异(例如XOR)。相差0的区域没有变化。

从你的问题不清楚这幅画本身是慢还是只是重画数据的传递。还不清楚在传输的另一端可以进行何种编码/解码。您是否必须按照指定的方式发送数据,或者如果您愿意,可以用其他方式对数据进行编码吗?

您的数据包每个矩形有8字节的开销“(魔术字一个字节,校验和一个字节,区域坐标六个字节,每个像素两个字节)”。我从每个像素的两个字节中得到它,颜色深度是16位?因此,由于开销,您概述的一些最小矩形实际上比将它们与其他矩形组合并在非更新区域上重新发送一些数据要花费更多。

找到每个都有开销的矩形的实际问题类似于ITA Software提出的“Strawberry Fields”招聘问题。原始链接已失效,但here is someone's solution with problem description.

在57600波特,你可以发送每秒7200字节,即每像素两个字节为3600像素。作为一个正方形,这是一个60x60。你肯定在你的例子中概述了更多,这不算开销。

还需要考虑接收端监视器的刷新率。如果显示器每秒刷新60次并且你每秒只能发送一个60x60平方,这看起来会怎样?

需要考虑的事项:

  • 降低颜色深度
  • 运行长度编码每条扫描线的像素差异
  • 尝试每个区域更加雄心勃勃的压缩,但要注意开销
  • 发送非图形数据并让接收者计算图形(例如,在此示例中,发送已更改的文本,更新的时间等,并让接收者绘制进度条等)。
  • 放弃这种疯狂