如何比较图像与python

时间:2012-07-02 07:50:54

标签: python image compare

我正在寻找一种比较两个图像的算法(我使用python)。

我找到了PIL库,numpy / scipy和opencv。我知道如何在灰度,二进制,直方图中进行转换......这没关系,但我不知道我要对这两个图像做什么,说“是的,它们是相似的//它们可能是相似的//他们不匹配“。

你知道正确的方法吗?

3 个答案:

答案 0 :(得分:1)

如果你想检查它们是否是二进制相等的,你可以计算它们的校验和并进行比较。如果你想以其他方式检查它们是否相似,它会更复杂,绝对不适合Stack Overflow上发布的简单答案。它只取决于你如何定义相似性,但无论如何它需要良好的编程技巧和大量代码。

答案 1 :(得分:1)

一个简单的实现是聚合两个图像之间的相应标准化像素坐标之间的误差/不相似性。更高级的技术将涉及比较空间特征(使用feature detection /计算机视觉技术)和颜色分布/频率技术。您还可以尝试缩小图像(通过算法或使用硬件/ mipmapping,如果是3D上下文),然后再进行比较,以提供更大的容差。出血边缘AFAIK是图像的小波变换/表示。

当然,您也可以搜索执行此操作的现有库,例如pHash

答案 2 :(得分:0)

我放在一起的脚本,用于目视检查图像的变化。结果是一个白色的图像,除了不同的像素。像素比例越暗,差异越大;他们是有色的"显示颜色变化,例如如果 旧图像更红,差异图像将显示青色区域;如果新的 相反,图像更多,差异图像将显示红色区域。

唯一的缺点是速度慢,但我确信可以使用numpy或仅使用处理像素组的理解来改进它。

#!/usr/bin/env python

TINT = 1 # exxagerate differences in tone
MINUTE = 5 # less than "x" points of difference
INCREASE_MINUTE = 2 # boost of minute differences

import sys
from PIL import Image

img1 = Image.open(sys.argv[1])
img2 = Image.open(sys.argv[2])

i1 = img1.load()
i2 = img2.load()

if img1.size != img2.size:
    print "Images %s and %s have different sizes, cannot compare" \
        % (sys.argv[1], sys.argv[2])
    sys.exit(1)

imgmap = Image.new( 'RGB', img1.size, "white")
imap = imgmap.load()

row_averages = []
for y in range(img1.size[1]):
    for x in range(img1.size[0]):
            p1 = i1[x, y]
            p2 = i2[x, y]
        diffpixel = [255, 255, 255]

        # color differences
        diffs = [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]]
        absdiff = reduce(lambda a, b: abs(a) + abs(b), diffs)
        diffsmag = [a * TINT for a in diffs]
        diffplus = [max(0, a) for a in diffs]
        totplus = reduce(lambda a, b: a + b, diffplus)
        diffminus = [min(0, a) for a in diffs]

        # apply negative differences (e.g. less red -> take red)
        diffpixel = [ a + b for a, b in zip(diffpixel, diffminus)]
        # subtract positive differences (e.g. more red -> take from non-red channels)
        diffpixel = [ a - totplus for a in diffpixel ]
        # ... put back what we took from red
        diffpixel = [ a + b for a, b in zip(diffpixel, diffplus)]

        if absdiff > 0 and absdiff < MINUTE:
            # Increase contrast of minute differences
            diffpixel = [a - INCREASE_MINUTE for a in diffpixel]
        diffpixel = [max(0, a) for a in diffpixel]

        imap[x, y] = tuple(diffpixel)

imgmap.save(sys.argv[3])