Created
December 9, 2024 15:41
-
-
Save leejseo/7bb82f91d83480e1749f02fbef1ccae4 to your computer and use it in GitHub Desktop.
Overlay broken glass
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import cv2 | |
import numpy as np | |
def overlay_glass_effect(input_path, glass_path, output_path, alpha=0.5): | |
""" | |
input 사진 위에 glass.png를 합성하여 효과를 적용하는 함수 | |
:param input_path: 원본 이미지 경로 | |
:param glass_path: 유리 패턴 이미지 경로 | |
:param output_path: 결과 이미지 저장 경로 | |
:param alpha: 투명도 설정 (0.0 ~ 1.0) | |
""" | |
# input 이미지 읽기 | |
input_image = cv2.imread(input_path) | |
if input_image is None: | |
raise ValueError("Input 이미지를 찾을 수 없습니다.") | |
# glass 이미지 읽기 | |
glass_image = cv2.imread(glass_path, cv2.IMREAD_UNCHANGED) # Glass 이미지 읽기 | |
if glass_image is None: | |
raise ValueError("Glass 이미지를 찾을 수 없습니다.") | |
# glass 이미지를 input 이미지 크기에 맞게 조정 | |
resized_glass = cv2.resize( | |
glass_image, (input_image.shape[1], input_image.shape[0])) | |
# glass 이미지가 투명 채널을 가진 경우 처리 | |
if resized_glass.shape[2] == 4: # Glass 이미지가 RGBA일 경우 | |
b, g, r, a = cv2.split(resized_glass) # RGBA 분리 | |
alpha_channel = a / 255.0 # 0~255 범위를 0~1로 정규화 | |
overlay = cv2.merge((b, g, r)) # RGB 채널만 추출 | |
# 투명 픽셀에 흰색 배경 추가 | |
white_background = np.ones_like( | |
overlay, dtype=np.uint8) * 255 # 흰색 배경 생성 | |
blended_glass = np.zeros_like( | |
overlay, dtype=np.uint8) # 결과 이미지를 저장할 빈 배열 생성 | |
for c in range(3): # RGB 각 채널에 대해 블렌딩 수행 | |
blended_glass[:, :, c] = ( | |
(1 - alpha_channel) * white_background[:, :, c] + | |
alpha_channel * overlay[:, :, c] | |
).astype(np.uint8) | |
# 알파 블렌딩 수행 | |
for c in range(3): # RGB 각 채널에 대해 처리 | |
input_image[:, :, c] = ( | |
1.0 - alpha_channel) * input_image[:, :, c] + alpha_channel * blended_glass[:, :, c] | |
else: | |
# glass 이미지와 input 이미지 블렌딩 (투명도가 없는 경우) | |
input_image = cv2.addWeighted( | |
input_image, 1 - alpha, resized_glass, alpha, 0) | |
# 결과 저장 | |
cv2.imwrite(output_path, input_image) | |
print(f"결과 이미지가 저장되었습니다: {output_path}") | |
# 사용 예시 | |
overlay_glass_effect('/Users/jongseo/Downloads/105.png', | |
'/Users/jongseo/Downloads/glass.png', 'output.jpg', alpha=0.3) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment