가우시안 블러링
가우시안 블러링은 OpenCV에서 가장 효과적인 노이즈 제거 및 이미지 스무딩 기법 중 하나입니다. 특히 가우시안 노이즈(백색 노이즈) 제거에 뛰어난 성능을 보입니다.
가우시안 필터란?
가우시안 필터는 가우시안 분포(정규분포)를 기반으로 한 컨볼루션 필터입니다. 평균값 필터와 달리 중심 픽셀에 가까운 픽셀일수록 더 큰 가중치를 부여하고, 멀리 있는 픽셀일수록 작은 가중치를 적용합니다.
가우시안 함수의 특징
-
중심에서 멀어질수록 가중치가 지수적으로 감소
-
표준편차(sigma) 값에 따라 분포의 폭이 결정됨
-
sigma 값이 클수록 더 넓은 범위의 픽셀에 영향을 미침
-
대칭적인 종 모양의 분포를 가짐
평균값 필터와의 차이점
평균값 필터는 커널 내 모든 픽셀에 동일한 가중치를 적용하지만, 가우시안 필터는 거리에 따라 다른 가중치를 적용하여 더 자연스러운 블러링 효과를 제공합니다.
cv2.GaussianBlur() 함수
OpenCV에서 가우시안 블러링을 적용하는 주요 함수입니다.
함수 문법
cv2.GaussianBlur(src, ksize, sigmaX, sigmaY=None, borderType=cv2.BORDER_DEFAULT)
매개변수 설명
|
매개변수 |
타입 |
설명 |
|---|---|---|
|
src |
numpy.ndarray |
입력 이미지 |
|
ksize |
tuple |
가우시안 커널 크기 (width, height), 반드시 홀수여야 함 |
|
sigmaX |
float |
X 방향 표준편차 |
|
sigmaY |
float |
Y 방향 표준편차 (기본값: sigmaX와 동일) |
|
borderType |
int |
경계 처리 방식 (기본값: BORDER_DEFAULT) |
중요한 규칙
-
커널 크기는 반드시 양의 홀수여야 함 (3, 5, 7, 9, ...)
-
ksize를 (0,0)으로 지정하면 sigma 값에 의해 자동으로 커널 크기가 결정됨
-
sigma 값이 클수록 블러링 효과가 더 강해짐
-
sigmaX만 지정하면 sigmaY는 자동으로 sigmaX와 동일하게 설정됨
기본 사용 예제
Python 예제
import cv2
import numpy as np
# 이미지 읽기
img = cv2.imread('image.jpg')
# 가우시안 블러링 적용 (5x5 커널, sigmaX=0)
blurred = cv2.GaussianBlur(img, (5, 5), 0)
# 결과 출력
cv2.imshow('Original', img)
cv2.imshow('Gaussian Blur', blurred)
cv2.waitKey(0)
cv2.destroyAllWindows()
다양한 커널 크기 비교
import cv2
import numpy as np
# 원본 이미지 읽기
original = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 다양한 커널 크기로 블러링 적용
kernels = [3, 7, 15, 31]
for k in kernels:
blurred = cv2.GaussianBlur(original, (k, k), 0)
cv2.imshow(f'Kernel {k}x{k}', blurred)
cv2.waitKey(0)
cv2.destroyAllWindows()
Sigma 값 변경 효과 확인
import cv2
# 원본 이미지
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('Original', img)
# 다양한 sigma 값으로 테스트
for sigma in range(1, 6):
# 커널 크기를 (0,0)으로 설정하여 sigma에 의한 자동 결정
blurred = cv2.GaussianBlur(img, (0, 0), sigma)
cv2.imshow(f'Sigma: {sigma}', blurred)
cv2.waitKey(0)
cv2.destroyAllWindows()
고급 사용법
비대칭 블러링
import cv2
img = cv2.imread('image.jpg')
# X방향과 Y방향에 다른 sigma 값 적용
# sigmaX=5, sigmaY=1로 설정하여 수평방향 블러링 강화
blurred = cv2.GaussianBlur(img, (15, 15), sigmaX=5, sigmaY=1)
cv2.imshow('Asymmetric Blur', blurred)
cv2.waitKey(0)
cv2.destroyAllWindows()
노이즈 제거 예제
import cv2
import numpy as np
# 노이즈가 있는 이미지 생성
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 가우시안 노이즈 추가
noise = np.random.normal(0, 25, img.shape).astype(np.uint8)
noisy_img = cv2.add(img, noise)
# 가우시안 블러로 노이즈 제거
denoised = cv2.GaussianBlur(noisy_img, (5, 5), 1.4)
# 결과 비교
cv2.imshow('Original', img)
cv2.imshow('Noisy', noisy_img)
cv2.imshow('Denoised', denoised)
cv2.waitKey(0)
cv2.destroyAllWindows()
실시간 블러링 조정
import cv2
def apply_blur(val):
# 트랙바 값을 커널 크기로 변환 (홀수만 허용)
kernel_size = val * 2 + 1
blurred = cv2.GaussianBlur(original, (kernel_size, kernel_size), 0)
cv2.imshow('Gaussian Blur Control', blurred)
# 원본 이미지 읽기
original = cv2.imread('image.jpg')
# 윈도우 생성
cv2.namedWindow('Gaussian Blur Control')
# 트랙바 생성 (0~20 범위)
cv2.createTrackbar('Blur Level', 'Gaussian Blur Control', 0, 20, apply_blur)
# 초기 이미지 표시
apply_blur(0)
cv2.waitKey(0)
cv2.destroyAllWindows()
실용적인 활용 예제
이미지 전처리용 블러링
import cv2
def preprocess_image(img_path):
"""이미지 전처리를 위한 가우시안 블러링"""
img = cv2.imread(img_path)
# 약간의 블러링으로 노이즈 제거
preprocessed = cv2.GaussianBlur(img, (3, 3), 0.5)
return preprocessed
# 사용 예제
processed_img = preprocess_image('noisy_image.jpg')
cv2.imwrite('preprocessed_image.jpg', processed_img)
배경 블러 처리
import cv2
def create_background_blur(img_path, blur_strength=15):
"""배경 블러 효과 생성"""
img = cv2.imread(img_path)
# 강한 블러링으로 배경 효과 생성
background = cv2.GaussianBlur(img, (blur_strength*2+1, blur_strength*2+1), blur_strength)
return background
# 포트레이트 모드 스타일 배경 블러
blurred_bg = create_background_blur('portrait.jpg', 25)
cv2.imwrite('blurred_background.jpg', blurred_bg)
매개변수 최적화 가이드
커널 크기 선택 기준
-
작은 커널 (3x3, 5x5): 세밀한 노이즈 제거, 디테일 보존
-
중간 커널 (7x7, 9x9): 일반적인 블러링, 균형잡힌 효과
-
큰 커널 (15x15 이상): 강한 블러링, 배경 처리용
Sigma 값 설정 가이드
-
sigma = 0: 커널 크기에 의한 자동 계산
-
sigma < 1: 약한 블러링, 노이즈 제거용
-
sigma = 1~3: 중간 정도 블러링
-
sigma > 3: 강한 블러링, 특수 효과용
성능 고려사항
# 성능 최적화된 블러링
def optimized_gaussian_blur(img, strength='medium'):
"""성능을 고려한 가우시안 블러링"""
blur_params = {
'light': ((3, 3), 0.8),
'medium': ((5, 5), 1.2),
'strong': ((9, 9), 2.0)
}
ksize, sigma = blur_params.get(strength, blur_params['medium'])
return cv2.GaussianBlur(img, ksize, sigma)
주의사항 및 팁
커널 크기 제한사항
-
커널 크기가 클수록 연산 시간이 기하급수적으로 증가
-
메모리 사용량도 커널 크기에 비례하여 증가
-
실시간 처리가 필요한 경우 적절한 크기 선택 필요
에지 보존
가우시안 블러링은 전체적으로 균등하게 블러 처리하므로 중요한 에지 정보가 손실될 수 있습니다. 에지를 보존하면서 노이즈를 제거하려면 다른 필터링 기법을 고려해야 합니다.
컬러 이미지 처리
# 컬러 채널별 개별 처리
b, g, r = cv2.split(img)
b_blur = cv2.GaussianBlur(b, (5, 5), 1)
g_blur = cv2.GaussianBlur(g, (5, 5), 1)
r_blur = cv2.GaussianBlur(r, (5, 5), 1)
result = cv2.merge([b_blur, g_blur, r_blur])
# 또는 전체 이미지에 한번에 적용 (권장)
result = cv2.GaussianBlur(img, (5, 5), 1)