【问题标题】:How to move the circular image to the exact center position of the bigger image?如何将圆形图像移动到大图像的确切中心位置?
【发布时间】:2021-05-28 22:18:16
【问题描述】:

我想将圆形图像移动到大图像的确切中心位置。如何准确地完成这项任务?

from IPython.display import display
import numpy as np
from PIL import Image, ImageDraw, ImageFilter

def show_saved_image(str):
    img = Image.open(str)
    display(img)

im1 = Image.open('rocket.jpg')
im2 = Image.open('lena.jpg')

#height, width, channels = im1.shape
im1_width, im1_height = im1.size
im1_centreX, im1_centreY = int(im1_width/2), int(im1_height/2)
im2_width, im2_height = im2.size
im2_centreX, im2_centreY = int(im2_width/2), int(im2_height/2)
print(im1_width, im1_height)
print(im2_width, im2_height)

radius = int(min(im2_width/2, im2_height/2))
ulX, ulY = im2_centreX-radius, im2_centreY-radius
lrX, lrY = im2_centreX+radius, im2_centreY+radius

desired_pointX, desired_pointY = im1_centreX-radius, im1_centreY-radius
# ![rocket_pillow_paste_out](data/dst/rocket_pillow_paste_out.jpg)

mask_im = Image.new("L", im2.size, 0)
draw = ImageDraw.Draw(mask_im)
draw.ellipse((ulX, ulY, lrX, lrY), fill=255)

# mask_im_blur = mask_im.filter(ImageFilter.GaussianBlur(10))
# mask_im_blur.save('mask_circle_blur.jpg', quality=95)

back_im = im1.copy()
back_im.paste(im2, (desired_pointX, desired_pointY), mask_im)

#back_im.paste(im2, (desired_pointX, desired_pointY), mask_im_blur)
back_im.save('output.jpg', quality=95)
    
im = Image.open('output.jpg')
draw = ImageDraw.Draw(im)
draw.ellipse((im1_centreX-4, im1_centreY-4, im1_centreX+4, im1_centreY+4 ), fill=(0, 255, 0), outline=(0, 0, 0))
draw.ellipse((desired_pointX-4, desired_pointY-4, desired_pointX+4, desired_pointY+4 ), fill=(255, 0, 0), outline=(0, 0, 0))
im.save('imagedraw.jpg', quality=95)

show_saved_image("imagedraw.jpg")

图片:

rocket.jpg

lena.jpg

如果有其他方法,也请帮助我。

【问题讨论】:

  • 包含的两个图像是相同的。请检查

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


【解决方案1】:

你只需要修改这一行

desired_pointX, desired_pointY = im1_centreX - radius, im1_centreY - radius

desired_pointX, desired_pointY = im1_centreX - int(im2_width/2), im1_centreY - int(im2_height/2)

您的mask_im 具有形状im2.size,因此您需要适应它,而不仅仅是圆的半径。由于半径为int(im2_height/2),所以垂直对齐很好,但半径小于int(im2_width/2),所以左移不足。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    相关资源
    最近更新 更多