python从png获取像素位置

时间:2019-01-11 09:02:00

标签: python python-imaging-library

我正在编辑图像的Web应用程序,其中一部分包含html上的画布,我得到一个选择区域,该区域保存为下面的png示例图像

enter image description here

下一步是获取选择区域的x,y位置,因此我知道仅在此处应用效果的代码看起来像这样

pixels = img.load()
if cropped:
    x, y = position['left'], position['top']
else:
    x, y = 0, 0

img_width, img_height = 0, 0
matches = []
counter = 0
for _ in range(img.width * img.height):
    if img_width == img.width:
        img_width = 0
        img_height += 1

    counter += 1

    pixel = pixels[img_width, img_height]

    if pixel != (0, 0, 0, 0):
        matches.append([img_width+y, img_height+x])

    img_width += 1

if matches:
    filename = random_filename(extension='.pickle')
    with open(filename, 'wb') as f:
        # Pickle the 'data' dictionary using the highest protocol available.
        pickle.dump(matches, f, pickle.HIGHEST_PROTOCOL)

这将获取细胞并将其保存到泡菜中。

但是,当我对这些单元格应用效果时,会出现“晕轮效果”,其中选择线距主要选择区域的距离为

enter image description here

我确保不是应用效果出现问题,因为它仅使用指定区域,而不会。

我又走了一步,使用选择区域像素之一重建了png文件,以查看它是否有问题(应该这样做)

In [1]: from PIL import Image

In [14]: new = Image.new('RGB', (600, 399))

In [15]: import pickle

In [16]: pickle_file = open('pickle_cells/qPxsEaw7wcQR5YWK9iZrb6r.pickle', 'rb')

In [17]: cells = pickle.load(pickle_file)

In [18]: pickle_file.close()

In [20]: cells[0]
Out[20]: [259, 117]

In [22]: for cell in cells:
    ...:     new.putpixel([cell[0], cell[1]], (50, 50, 50))
    ...:

In [23]: new.save('test.png')

In [24]:

这将创建显示相同错误的图像

enter image description here

2 个答案:

答案 0 :(得分:2)

我认为问题在于您的PNG文件未包含您期望的文件。它具有41种独特的颜色-不是您可能期望的两种。

文件中的每个像素均为黑色,背景为白色。查看此分析中红色标记的部分:

enter image description here

41种黑色阴影完全由alpha通道的变化表示。看一下这些颜色的直方图,所有颜色的R = 0,G = 0,B = 0,但alpha通道变化很大。

enter image description here

我建议对alpha通道设置阈值。


我使用 ImageMagick 生成了上述分析-大多数Linux发行版中都包含了该分析,并且适用于macOS和Windows。只需在命令行上:

magick identify -verbose image.png

或者,如果使用的是v6或更早版本,请放下magick并运行:

identify -verbose image.png

答案 1 :(得分:0)

有趣的事情;这是由于使用抗锯齿造成的

img = img2.resize((full_width, full_height), PILImage.ANTIALIAS)

正是导致问题的原因。