如何将圆形图像移动到更大图像的确切中心位置?

How to move the circular image to the exact center position of the bigger image?

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

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

如果还有其他方法,请也帮我解决一下。

你只需要修改这一行

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),所以左移不足