b__ono__ng
[Image Processing] Edge Detection - Unsharp Masking 본문
Unsharp Mask 방식은 이미지 대조를 더 크게 해 엣지를 강조하는 방법이다.
배경과 객체가 각각 x=1, x=10이라는 데이터를 가진다고 해보자. 그러면 이 엣지가 1~10 사이에서 선형적으로 증가하는 데이터를 가지게 될건데, 이 이미지를 블러처리하는거다. 그러면 선형적인 그래프가 비선형적인 그래프로 바뀔것인데, 비선형적인 그래프로 바뀌는 바에 따라 생기는 오차를 더해주는거다.결국, 기존 이미지에서 블러처리함에 따라 발생하는 오차만큼을 빼줌으로서, 1에 가까운 데이터는 더 1에 가깝게, 10에 가까운 데이터는 더 10에 가깝에 됨에 따라 더 급격한 대조를 갖게 된다.
이를 opencv로 구현해보면 다음과 같다.
import cv2
import numpy as np
def unsharp_masking(image, sigma=2.0, strength=5):
blurred = cv2.GaussianBlur(image, (0, 0), sigma)
sharpened = cv2.addWeighted(image, 1.0 + strength, blurred, -strength, 0)
return sharpened
image = cv2.imread('Image_path')
unsharped_image = unsharp_masking(image, sigma=2.0, strength=5)
cv2.imshow('image', image)
cv2.imshow('unsharped_image', unsharped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
opencv를 사용하지 않고 구현하면 다음과 같다.
def gaussian_blur(image, sigma):
# size는 일반적으로 sigma의 3배 이상으로 설정(가우시안 분포의 99.7%가 해당 범위에 포함되기 때문). 대칭적인 커널이 되도록 2배 및 홀수로 설정
size = int(sigma * 3) * 2 + 1
# 가우시안 커널 생성
gaussian_kernel = create_gaussian_kernel(size, sigma)
height, width = image.shape
blurred_image = np.zeros((height, width))
# 가우시안 블러 적용 (가우시안 커널과 이미지의 원소를 곱한 후 모두 더함(element-wise))
for y in range(size//2, height-size//2): # 이미지의 가장자리는 가우시안 블러 적용이 불가능하므로 제외
for x in range(size//2, width-size//2):
blurred_image[y, x] = np.sum(
image[y-size//2:y+size//2+1, x-size//2:x+size//2+1] * gaussian_kernel) # 커널과 이미지의 원소를 곱한 후 모두 더함(element-wise)
return blurred_image
def create_gaussian_kernel(size, sigma): # size: 커널의 크기, sigma: 가우시안 블러의 표준편차
kernel = np.zeros((size, size))
for y in range(size):
for x in range(size):
kernel[y, x] = np.exp(-((x - size//2)**2 + (y - size//2)**2) / (2 * sigma**2)) # 가우시안 분포의 지수항. 표준편차가 클수록 0에 가까워짐
kernel /= np.sum(kernel) # 커널의 모든 원소의 합이 1이 되도록 정규화
return kernel
여기서 sigma는 표준편차에 해당하여, 값이 커질 수록 분포가 넓어져 blur 정도가 강해진다. 반대로 값이 작을 수록 분포가 좁아져 원본 이미지에 가깝게 된다. 일반적으로 커널의 사이즈는 sigma의 3~4배 정도로 할당한다.
strength는 원본 이미지에 더해줄 오차(mask)의 강도를 결정하는데, 1일 경우 오차 만큼을 더해주게되고, 2일 경우 오차의 2배 만큼을 더해준다. 반대로 0.5일 경우 오차의 절반 만큼을 더해준다.
'IT > AI' 카테고리의 다른 글
HOI (Human Object Interaction) Detection (2/3) - Approaches (3) | 2024.12.15 |
---|---|
HOI (Human Object Interaction) Detection (1/3) - Overview (8) | 2024.09.29 |
[Image Processing] Edge Detection - Sobel (2) | 2024.01.14 |
[SageMaker] YOLOv8 모델 활용 시 경로 설정 (0) | 2023.11.07 |
[CLIP] 행동 기반의 쓰레기 무단 투기 이벤트 탐지 모델 (2) (0) | 2023.09.29 |