Skip to content

Instantly share code, notes, and snippets.

@leejseo
Created December 9, 2024 15:41
Show Gist options
  • Save leejseo/7bb82f91d83480e1749f02fbef1ccae4 to your computer and use it in GitHub Desktop.
Save leejseo/7bb82f91d83480e1749f02fbef1ccae4 to your computer and use it in GitHub Desktop.
Overlay broken glass
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