使用PIL或Numpy数组,如何从图像中删除整行?

5
我想知道如何从一张图片中删除整行,最好是基于行的颜色?
例如:我有一张高度为5像素的图片,顶部两行和底部两行是白色的,中间一行是黑色的。我想知道如何让PIL识别这一行黑色像素,然后删除整行并保存新的图片。
我有一些Python的知识,并且到目前为止一直通过列出“getdata”的结果来编辑我的图像,所以任何带有伪代码的答案可能已经足够了。谢谢。
1个回答

7
我为您编写了以下代码,它可以删除每一行完全是黑色的内容。我使用了for循环的else子句,当循环没有被break语句中断时执行该子句。请注意,保留了HTML标签。
from PIL import Image

def find_rows_with_color(pixels, width, height, color):
    rows_found=[]
    for y in xrange(height):
        for x in xrange(width):
            if pixels[x, y] != color:
                break
        else:
            rows_found.append(y)
    return rows_found

old_im = Image.open("path/to/old/image.png")
if old_im.mode != 'RGB':
    old_im = old_im.convert('RGB')
pixels = old_im.load()
width, height = old_im.size[0], old_im.size[1]
rows_to_remove = find_rows_with_color(pixels, width, height, (0, 0, 0)) #Remove black rows
new_im = Image.new('RGB', (width, height - len(rows_to_remove)))
pixels_new = new_im.load()
rows_removed = 0
for y in xrange(old_im.size[1]):
    if y not in rows_to_remove:
        for x in xrange(new_im.size[0]):
            pixels_new[x, y - rows_removed] = pixels[x, y]
    else:
        rows_removed += 1
new_im.save("path/to/new/image.png")

如果您有问题,请随时询问 :)

感谢您抽出时间回答 halex。我认为我在给出的示例中应该更具体些,因为我之前尝试过类似的方法。任何一行都有可能以黑色像素开头,所以一些本来不需要移除的行却被误判了。这就是为什么我需要知道如何只删除完全为黑色(颜色不重要,只是举例)或者完全透明的行。 - Py-Newbie
2
@Py-Newbie 我修改了代码,以删除完全为黑色的行。如果您想删除透明的行,则不能将图像转换为 RGB,而要转换为 RGBA - halex
2
再次感谢您的帮助,它完美地解决了我的问题。我还有一个问题想问您,您能否修改您编写的代码以查找所有黑色列(而不是之前的行),裁剪列之间的内容并制作新图像。可以在此处找到示例图像http://postimage.org/image/bh8or7yzn。从该示例中,目标是拥有10个单独的图像。我希望这足够详细,让您明白我的意思。 - Py-Newbie
它对于行非常有效,但如何对列执行它。 - user3768070

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接