Crop non symmetric area of an image with Python/PIL

前端 未结 1 1130
死守一世寂寞
死守一世寂寞 2021-01-03 05:57

Is there a way to cut out non rectangular areas of an image with Python PIL?

e.g. in this picture I want to exclude all black areas as well as tower

相关标签:
1条回答
  • 2021-01-03 06:06

    If I understood correctly, you want to make some areas transparent within the image. And these areas are random shaped. Easiest way (that I can think of) is to create a mask and put it to the alpha channel of the image. Below is a code that shows how to do this.

    If your question was "How to create a polygon mask" I will redirect you to:

    SciPy Create 2D Polygon Mask

    and look the accepted answer.

    br,

    Juha

    import numpy
    import Image
    
    # read image as RGB and add alpha (transparency)
    im = Image.open("lena.png").convert("RGBA")
    
    # convert to numpy (for convenience)
    imArray = numpy.asarray(im)
    
    # create mask (zeros + circle with ones)
    center = (200,200)
    radius = 100
    mask = numpy.zeros((imArray.shape[0],imArray.shape[1]))
    for i in range(imArray.shape[0]):
        for j in range(imArray.shape[1]):
            if (i-center[0])**2 + (j-center[0])**2 < radius**2:
                mask[i,j] = 1
    
    # assemble new image (uint8: 0-255)
    newImArray = numpy.empty(imArray.shape,dtype='uint8')
    
    # colors (three first columns, RGB)
    newImArray[:,:,:3] = imArray[:,:,:3]
    
    # transparency (4th column)
    newImArray[:,:,3] = mask*255          
    
    # back to Image from numpy
    newIm = Image.fromarray(newImArray, "RGBA")
    newIm.save("lena3.png")
    

    Edit

    Actually, I could not resist... the polygon mask solution was so elegant (replace the above circle with this):

    # create mask
    polygon = [(100,100), (200,100), (150,150)]
    maskIm = Image.new('L', (imArray.shape[0], imArray.shape[1]), 0)
    ImageDraw.Draw(maskIm).polygon(polygon, outline=1, fill=1)
    mask = numpy.array(maskIm)
    

    Edit2

    Now when I think of it. If you have a black and white svg, you can load your svg directly as mask (assuming white is your mask). I have no sample svg images, so I cannot test this. I am not sure if PIL can open svg images.

    0 讨论(0)
提交回复
热议问题