背景:我需要比较不同的图像。图像很大(约1400x9000 px)、机器生成且高度受限(特定线性用户界面的屏幕截图),预计几乎相同,不同之处在于以下三种可能性之一:
我正试图建立一个工具,为人类的评论者突出的差异,基本上是一个面向行的差异的图像版本。为此,我试图扫描图像逐行比较,以确定是否行相同。我的最终目标是一个实际的diff-like输出,它可以检测到部分丢失/添加/不同,并尽快同步相同内容的其余部分的图像,但对于第一个剪切,我将使用一个更简单的方法,将两个图像重叠(alpha混合),不同的线用特定的颜色突出显示(即α与第三行纯色混合)。一开始我尝试使用Python图像库,但是速度太慢了好几个数量级,所以我决定尝试使用vips
,这应该要快得多。然而,我完全不知道在使用vips
操作之后如何表达我的想法。简单版本的伪代码基本上是:
out = []
# image1 and image2 are expected, but not guaranteed to have the same height
# they are likely to have different heights if different
# most lines are entirely white pixels
for line1, line2 in zip(image1, image2):
if line1 == line2:
out.append(line1)
else:
# ALL_RED is a line composed of solid red pixels
out.append(line1.blend(line2, 0.5).blend(ALL_RED, 0.5))
我在我的项目中使用pyvips
,但我也对使用普通vips
或任何其他绑定的代码感兴趣,因为这些操作是共享的,并且很容易跨方言翻译。你知道吗
编辑2:缺少/添加/更改部分的全尺寸图像:
如果OpenCV和NumPy是您的选项,那么至少对于查找和着色不同的行,会有一个非常简单的解决方案。你知道吗
在我的方法中,我只使用^{} 计算像素差异,并使用^{} 查找非零行索引。使用这些找到的行索引,我设置了一个额外的黑色图像,并为每行绘制红线。最终的混合只是一些线性混合:
对于所有相等的行,或
对于所有不同的行。你知道吗
以下是最终代码:
差异图像
diff
如下所示:最后的
output
是这样的:这将是有趣的,看到两个输入图像与省略的部分,如您在您的问题中所描述的。另外,使用原始大小的图像测试这种方法也是必要的,因为您提到了时间是至关重要的。你知道吗
不管怎样-希望有帮助!你知道吗
使用diff怎么样?很快。你所需要做的就是每次把png转换成文本扫描线,然后解析diff输出。你知道吗
例如:
我看到你的两张测试图片:
在这台旧笔记本电脑上。你所需要做的就是使用那些“更改”命令来标记你的图像。你知道吗
相关问题 更多 >
编程相关推荐