머신러닝/Computer Vision

[PIL/python] 이미지 합성하기/ how to paste rotated image(with turn black background as transparent) by PIL

Js.Y 2022. 3. 18. 18:08
728x90
반응형

단순히 이미지 두개를 겹칠 때는 아래처럼 paste함수로 해주면 된다.

from PIL import Image
 
image1 = Image.open("./image1.png")
image2 = Image.open("./image2.png")

image1 = image1.resize((500, 500))
image2 = image2.resize((300, 300))

#이미지 1번의 정 중앙에 놓고 싶어서
btsize = tuple(np.subtract(image1.size,image2.size))

new_image = Image.new('RGB',(500, 500), (255,2555,255))
new_image.paste(image1,(0,0))
new_image.paste(image2,(btsize[0]//2, btsize[1]//2))

new_image.save("merged_image.jpg","JPEG")
new_image.show()

 


근데 난 새로 들어가는 2번 이미지가 랜덤으로 돌아가게끔 설정해놨고,

image2 = image2.resize((300, 300)).rotate(30)

이 상태에서 뒷배경과 합성해놓으니 자꾸 rotation후 생기는 공백(black area)이 거슬린다.

 

 

한참 서치 후, 아래에서 다음 방법을 찾을 수 있었다.

 

How to use PIL (Python Image Library) rotate image and let black background to be transparency

I want to rotate a gray "test" image and paste it onto a blue background image. Now I just can remove the black color after rotate my gray "test" image, but their is now a white color section. How ...

stackoverflow.com

 

관건은 두 이미지를 "RGBA"(transparent 값이 포함되게끔) 형태로 바꾸고,

rotation 함수에 expand값을 넣어 확장 한 후, paste 뒤 mask에 합성할 이미지를 넣어주면 되는 것 같다.

from PIL import Image
import numpy as np

image1 = Image.open("./image1.jpg").convert("RGBA")
image2 = Image.open("./image2.jpg").convert("RGBA")

image1 = image1.resize((500, 500))
image2 = image2.resize((300, 300)).rotate(30, expand=1)

#이미지 1번의 정 중앙에 놓고 싶어서
btsize = tuple(np.subtract(image1.size,image2.size))

new_image = Image.new('RGB',(500, 500), (255,2555,255))
new_image.paste(image1,(0,0))
new_image.paste(image2,(btsize[0]//2, btsize[1]//2), image2)

#new_image.save("merged_image.jpg","JPEG")
new_image.show()

728x90
반응형