Image processing 确定两个位图之间的差异

Image processing 确定两个位图之间的差异,image-processing,bitmap,Image Processing,Bitmap,我正在寻找一种有效的方法来查看位图是否已被修改。我目前采用的方法是在位图类中为每个图像使用copyPixelsToBuffer(Buffer dst)方法。然后我可以比较这两个缓冲区,看看是否有差异 在这种情况下,位图类中提供的sameAs方法看起来并不有用 我正在考虑的另一种实现方法是使用.getPixel()方法并比较两个图像,这将缺乏效率。对于两个图像数据缓冲区的简单比较,可以执行二进制搜索以查找更改 这有可能改进简单的每像素检查,因为对图像的大多数更改是在非常接近的像素组中进行的,而不仅

我正在寻找一种有效的方法来查看位图是否已被修改。我目前采用的方法是在位图类中为每个图像使用copyPixelsToBuffer(Buffer dst)方法。然后我可以比较这两个缓冲区,看看是否有差异

在这种情况下,位图类中提供的sameAs方法看起来并不有用


我正在考虑的另一种实现方法是使用.getPixel()方法并比较两个图像,这将缺乏效率。

对于两个图像数据缓冲区的简单比较,可以执行二进制搜索以查找更改

这有可能改进简单的每像素检查,因为对图像的大多数更改是在非常接近的像素组中进行的,而不仅仅是一个像素

因此,例如,如果数组的长度为100,则可以按以下顺序检查索引

一级至五十级

二级-25,75

3级-12、37、62、87

4级-6、18、31、43、56、68、81、93

等等

如果你发现了变化,停下来。最坏的情况是,没有变化,你检查每个像素


如果您正在寻找其他内容或需要帮助实现它,请告诉我。

如果您试图有效地检测图像是否已更改,最好计算原始图像的SHA1哈希并存储它。然后,在比较可能更改的图像时,只需打开新图像并散列这些字节,然后与原始图像的20字节散列进行比较。如果两个图像相同,则哈希值将相同。如果图像不同,SHA1散列也会不同

编辑(基于评论反馈): 如果您的系统期望频繁发生大量更改,则可以对文件中的位进行分布式采样以进行哈希。多少取决于您希望更改的像素数(基于历史数据),以及需要采样多少像素才能获得95%的统计置信区间

如果它说文件是相同的,那么您可以回头比较每一位(或完整文件的存储哈希)。这将加快对预期会有大量更改的场景的处理过程,而您只想确认用户确实进行了更改


这将限制您必须引用原始文件中位的次数。

只需获取表示图像数据的缓冲区,并通过像素循环比较它们的值。

什么方法?什么编程库/语言?我相信它是java,也许是Android上的?在Android上开发,对不起,我忘了指定它听起来不是很高效。有了一个大的图像,你将在内存中跳跃。“我认为最好做顺序比较,”KevinHsu说,这取决于情况,但也许你是对的。如果是java/android,那么这个问题是相关的:应该注意,散列只会引入不必要的开销——您仍然需要迭代像素+执行其他操作。即使您多次比较图像,哈希方法也可能不会带来好处,因为在许多情况下,您只需看几个像素就可以检测到差异。没错,如果您不希望经常更改,哈希算法工作得很好。如果对图像的更改是系统中的标准,则效率往往较低。提问者没有指定后面的场景,所以我们只能猜测。