Python Imaging Library:无法访问像素值

时间:2017-05-30 09:44:21

标签: python python-imaging-library

我想比较两个图像并保存差异图像,其中差异用红色标记。 不幸的是我收到以下错误:

Traceback (most recent call last):
  File "pythontest.py", line 216, in <module>
    nDiff = compare(sPathCur, sPathRef, sPathDif)
  File "pythontest.py", line 88, in compare
    pix_diff[y, x] = (255, 0, 0)
TypeError: function takes exactly 1 argument (3 given)
def compare(sPathCur, sPathRef, sPathDif):
    im_cur = Image.open(sPathCur)
    im_ref = Image.open(sPathRef)

    im_dif = im_cur.convert('L')  # convert image to grey scale

    delta = ImageChops.difference(im_cur, im_ref)
    width, height = delta.size

    pix_delta = delta.load()
    pix_diff = im_dif.load()

    for y in range(width):
        for x in range(height):
            r, g, b = pix_delta[y, x]
            if (r > 0 or g > 0 or b > 0):
                pix_diff[y, x] = (255, 0, 0)

    im_dif.save(sPathDif)

1 个答案:

答案 0 :(得分:1)

执行转换为灰度图像后,每个像素都会分配一个值,而不是RGB三元组。

取自http://effbot.org/imagingbook/image.htm

  

从彩色图像转换为黑白时,库   使用ITU-R 601-2亮度变换:

L = R * 299/1000 + G * 587/1000 + B * 114/1000

因此,如果[x,y] = [0,0]的像素的(R,G,B)值为(100,150,200),那么在转换为灰度后,它将包含单个值140.75(这将是舍入为整数)

您可以通过在嵌套循环之前检查pix_diff [0,0]的值来验证这一点。它应该只返回一个值。

因此,你需要为pix_diff [y,x]中的每个像素分配一个灰度值,或者将pix_diff图像转换回RGB兼容格式,然后才能为每个像素分配{{1}的值}