比较两个图像是不是相同?

Posted

技术标签:

【中文标题】比较两个图像是不是相同?【英文标题】:Comparing two images as being identical?比较两个图像是否相同? 【发布时间】:2015-04-30 10:30:09 【问题描述】:

这可能很容易,但我仍然有点挣扎。 如果我想知道它们是否相同,如何比较两个图像? 假设我有一张图片A 和一张图片B 我想做类似的事情

if ( A == B ) ...

但这不起作用。

【问题讨论】:

如果我的回答没有帮助,您可以发布您尝试使用的代码吗? 你可以看到它之前问过的这个。 ***.com/questions/3270929/compare-2-images-in-php @gabe3886 谢谢。第二个答案已经符合我的需要了。 @TEMScripter 很好。我对答案投了赞成票,所以它也比我的更突出。 【参考方案1】:

我认为您需要更清楚地说明 相同 的含义。在 DigitalMicrograph 的图像分析框架内,它可能是(f.e.):

1) 光盘上的相同文件。

其他人已经回答了这个问题。但为简单起见 - 如果图像在 DM 中打开,您可以通过以下代码找出它链接到哪个“文件”:

image img := GetFrontImage()
imageDocument doc = img.ImageGetOrCreateImageDocument()
OKDialog("--> "+doc.ImageDocumentGetCurrentFile())

注意,光盘上的文件链接到 imageDocuments,而不是图像。

2) 所有像素中相同的像素值

只需比较图像差异的总和!

image A
image B
if ( 0 == sum(A-B) ) OKDialog( "Identical!" )

代码假定两个图像属于同一类型,但您可以分别检查类型。

3) 相同的内存对象

您可能有多个变量引用同一个“图像”,即您将一个图像作为局部变量,然后遍历图像列表以在列表中识别该图像。为此,您可以使用 imageLabel 或 imageID。内存中的任何图像都会自动分配。虽然 imageLabels 在空闲时被重新使用,但 imageID 从应用程序开始(从 1 开始)单调增加。我认为一般来说 imageID 比较好用。

image A
image B
if ( A.ImageGetLabel() == B.ImageGetLabel() ) OKDialog( "Identical!" )
if ( A.ImageGetID() == B.ImageGetID() ) OKDialog( "Identical!" )

4) 该图像是特定的“唯一”图像,但已保存并再次打开。

这里的一个典型场景是与数据相关联的调查图像。您可能想要打开数据和调查图像并检查它是否是“正确的”调查图像。 为此,有一个名为“全局图像 ID”的特定脚本对象,您可以在“对象”部分的 F1 帮助部分中找到有关它的信息。它类似于校验和,但不完全是一个。此 ID 由 4 个长值组成,这些值在创建图像时创建,之后不再更改。 (因此更改图像数据值或标签不会更改此全局 ID。)与上述 imageID 的主要区别在于,全局 ID 在您保存和加载图像时仍然存在。

【讨论】:

非常感谢。这是我想要的第三个例子。但其他例子也很棒!【参考方案2】:

当检查文件是否相同(因此图像应该在逻辑上遵循)时,您可以对两个文件进行 MD5 校验和并比较它们。如果校验和相同,则文件相同,因此图像必须相同。

【讨论】:

非常感谢您的回答。让文件“相同”是个好主意,但我的应用程序不同。我想在它们打开(甚至没有保存)时比较两个 DigitalMicrograph 的“图像”。

以上是关于比较两个图像是不是相同?的主要内容,如果未能解决你的问题,请参考以下文章

确定图像是不是相同,但大小不同

VB 如何判断两个图片框中的图像是相同或相似

python 比较两个图像,看它们是否相同(不论名称)

OpenCV - 检查两个图像是不是 100% 相同的最快方法

如何在 OpenCV 中检查两个图像是不是几乎相同?

JS 比较两个数组是不是相等 是不是拥有相同元素