【问题标题】:Problems cropping entire white lines from .png file从 .png 文件裁剪整个白线的问题
【发布时间】:2016-10-07 01:41:58
【问题描述】:

我想要做的是裁剪出给定 instagram 打印屏幕上方的白线。我尝试通过找到图像的中心并逐行向上,直到我发现第一行完全是白色的。知道为什么我的代码不起作用吗?

from PIL import Image

image_file = "test.png"
im = Image.open(image_file)
width, height = im.size
centerLine = height // 2

entireWhiteLine = set()
entireWhiteLine.add(im.getpixel((0, 0)))
terminateUpperCrop = 1

while terminateUpperCrop != 2 :

    for i in range(centerLine, 1, -1) :
        entireLine = set()
        upperBorder = i - 1
        for j in range(0, width, 1) :
            entireLine.add((im.getpixel((i, j))))
            if entireLine == im.getpixel((0,0)):
                box = (0, upperBorder, width, height)
                crop = im.crop((box))
                crop.save('test2.png')
                terminateUpperCrop = 2

【问题讨论】:

  • 帮助人们回答你的问题的一个有用的事情是描述你的代码当前正在做什么以及它与你想要它做什么的不同之处。分享您的测试也有帮助。

标签: python set python-imaging-library crop


【解决方案1】:

您的getpixel() 调用实际上是用错误的方式搜索坐标,因此实际上您是在扫描左边缘。您可以使用以下方法。这将创建一行仅包含白色像素的数据。如果行的长度等于你的宽度,那么你就知道它们都是白色的。

from PIL import Image

image_file = "test.png"
im = Image.open(image_file)
width, height = im.size
centerLine = height // 2

white = (255, 255, 255)

for y in range(centerLine, 0, -1) :
    if len([1 for x in range(width) if im.getpixel((x, y)) == white]) == width - 1:
        box = (0, y, width, height)
        crop = im.crop((box))
        crop.save('test2.png')
        break

【讨论】:

  • 在这里,非常感谢!特别是您没有使用套装的任何原因?还是为了简单起见?
  • 我需要对其进行测试,但在这种情况下,列表可能会更快。您可以将所有像素添加到一个集合中,然后测试该集合是否有一个白色条目。将项目添加到集合可能比将项目添加到列表要慢。列表理解仅在像素为白色时添加,列表本身可以包含任何内容(我选择添加1)。例如,通过使用列表,您可以测试是否 95% 的条目是白色的,因为列表长度与白色的数量成正比。
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多