😏가우시안 블러링

가우시안 블러링

가우시안 블러링은 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)

참고 자료