【问题标题】:Masking two images and merge into one image屏蔽两张图像并合并为一张图像
【发布时间】:2021-01-05 02:29:07
【问题描述】:

我正在做一个项目,我在两张不同的图片上使用不同的蒙版,而不是将它们组合成一张图片。到目前为止,我已经有了遮罩(尽管边缘有一些错误),现在我正在尝试合并图像。

  1. 如何改进遮罩,使结果在边缘没有错误(参见图片)
  2. 如何有效地将图像组合成一张以生成第三张图像?我一直在尝试使用一些透明效果,但没有奏效。我想做的是合并这两个图像,使它们形成一个完整的圆圈。如果需要任何原始图像,请告诉我
    from PIL import Image
    
  
    # load images
    img_day  = Image.open('Day.jpeg')
    img_night  = Image.open('Night_mirror.jpg')
    night_mask = Image.open('Masks/12.5.jpg')
    day_mask = Image.open('Masks/11.5.jpg')
    
    # convert images
    #img_org  = img_org.convert('RGB') # or 'RGBA'
    night_mask = night_mask.convert('L')    # grayscale
    day_mask = day_mask.convert('L')
    
    # the same size
    img_day  = img_day.resize((750,750))
    img_night  = img_night.resize((750,750))
    night_mask = night_mask.resize((750,750))
    day_mask = day_mask.resize((750,750))
    # add alpha channel    
    
    img_day.putalpha(day_mask)
    img_night.putalpha(night_mask)
    img_night = img_night.rotate(-170)
    
    
    # save as png which keeps alpha channel 
    img_day.save('image_day.png')
    img_night.save('image_night.png')
    img_night.show()
    img_day.show()

感谢任何帮助

【问题讨论】:

  • 您有 3 个链接显示“在此处输入图片描述”。能否请您填写每个描述或说出它们上面的内容?
  • 另外,我对此感到困惑,因为您说要创建一个完美的圆;那么第一张图片是什么?

标签: python image-processing python-imaging-library masking


【解决方案1】:

给你点:

  1. 您对遮罩的问题只是源于您的遮罩并不完美。用油漆打开它们,你会看到在顶部,还有一条白线。只需使用填充工具将白色部分填充为黑色。之后它应该可以工作了。

  2. 我建议水平镜像而不是旋转图像。您可以为此使用PIL.ImageOps.mirror。然后使用img.paste() 将一张图片粘贴到另一张图片上。作为第二个参数,您给出了应该将图像粘贴到另一个上的坐标,并且非常重要的是,作为第三个参数,您指定了一个透明蒙版。由于您的图像已经有一个 Alpha 通道,您可以使用相同的图像作为蒙版。 PIL 将自动使用它的 alpha 通道进行遮罩。请注意,我必须将粘贴位置调整 4 个像素才能正确重叠图像。

from PIL import Image, ImageOps

# load images
img_day  = Image.open('day.jpg')
img_night  = Image.open('night.jpg')
night_mask = Image.open('night_mask.jpg')
day_mask = Image.open('day_mask.jpg')

# convert images
#img_org  = img_org.convert('RGB') # or 'RGBA'
night_mask = night_mask.convert('L')    # grayscale
day_mask = day_mask.convert('L')

# the same size
img_day  = img_day.resize((750,750))
img_night  = img_night.resize((750,750))
night_mask = night_mask.resize((750,750))
day_mask = day_mask.resize((750,750))
# add alpha channel    

img_day.putalpha(day_mask)
img_night.putalpha(night_mask)
img_night = ImageOps.mirror(img_night)


img_night.paste(img_day, (-4, 0), img_day)
img_night.save('composite.png')

结果:

【讨论】:

    【解决方案2】:

    主要问题是蒙版中的 (JPG) 伪影(顶部的白线,“平滑”边缘)。为什么不使用ImageDraw.arc 即时生成掩码?您需要的最后一步是使用Image.composite 合并您的两个图像。

    这是一些代码(我将您的第一张图像作为所需的输出,因此选择了角度):

    from PIL import Image, ImageDraw
    
    # Load images
    img_day = Image.open('day.jpg')
    img_night = Image.open('night.jpg')
    
    # Resize images
    target_size = (750, 750)
    img_day = img_day.resize(target_size)
    img_night = img_night.resize(target_size)
    
    # Generate proper masks
    day_mask = Image.new('L', target_size)
    draw = ImageDraw.Draw(day_mask)
    draw.arc([10, 10, 740, 740], 120, 270, 255, 150)
    night_mask = Image.new('L', target_size)
    draw = ImageDraw.Draw(night_mask)
    draw.arc([10, 10, 740, 740], 270, 120, 255, 150)
    
    # Put alpha channels
    img_day.putalpha(day_mask)
    img_night.putalpha(night_mask)
    
    # Compose and save image
    img = Image.composite(img_day, img_night, day_mask)
    img.save('img.png')
    

    这就是输出:

    ----------------------------------------
    System information
    ----------------------------------------
    Platform:    Windows-10-10.0.16299-SP0
    Python:      3.8.5
    Pillow:      8.0.1
    ----------------------------------------
    

    【讨论】:

    • 谢谢我不知道 arc 属性。能解释一下参数吗?如何更改弧的长度(半弧、四分之一等)
    • @sam 已经链接的documentation on ImageDraw.arc 回答了你所有的问题。
    猜你喜欢
    • 2013-07-18
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    相关资源
    最近更新 更多