본문 바로가기
Image Processing (Python)

Smoothing

by HanByol Jang 2021. 11. 17.
728x90

함수 설명

이미지에 흐림효과를 주어 번져보이게 하는 함수입니다.

주로 이미지안에서 노이즈를 줄이거나 경계선을 흐리게 할 때 사용합니다.

 

Smoothing filter에 따라 결과가 달라집니다. 주로 많이 사용하는 4가지 filter에 대해 소개하겠습니다.

 

1. Averaging Filter

Averaging 방법은 주변 픽셀값들의 평균을 취하는 형태입니다. 

아래와 같은 filter를 곱해 새로운 픽셀 값을 도출합니다.

 

2. Gaussian Filter

Gaussian filter는 가운데 부분의 값을 좀 더 큰 값으로 할당하여 중심 값을 보존하면서 주변의 값에 대한 평균을 취하는 형태입니다.

아래와 같이 Gaussian 분포를 가지는 filter를 곱해 새로운 픽셀 값을 도출합니다.

 

3. Median Filter

Median 방법은 filter안에 있는 픽셀 값들을 정렬 한 뒤 중간 값을 새로운 픽셀 값으로 도출합니다

이미지 내에 존재하는 값을 이용하여 결과를 얻는 대표적인 비선형 filter입니다.
특히, salt-and-pepper noise를 가지고 있는 경우 다른 필터링 보다 우수한 결과를 보입니다.

 

4. Bilateral Filter

앞선 세가지 방법은 이미지 전체에 동일한 필터를 적용시켜 흐리게 만들기 때문에, 물체의 경계선까지 흐려지게 됩니다.

반면에, Bilateral filter는 gaussian filter의 단점을 보완하고자 중심 픽셀에서의 거리에 따른 가중치뿐 아니라 픽셀 값 차이도 가중치로 둔 필터입니다.

위의 식처럼 중심 픽셀과 비슷한 값을 가지고 있는 픽셀 값에만 가중치를 주어 계산하고 값 차이가 큰 픽셀들은 계산에서 제거됩니다.

예를들어 경계부근의 왼쪽 픽셀은 값 차이가 큰 경계 너머 오른쪽 픽셀 값의 영향을 거의 받지 않습니다. 그렇기 때문에 경계가 그대로 보존된채 나머지 영역만 흐려지게 됩니다.


코드 설명

python3 OpenCV 라이브러리를 사용하여 4가지 필터를 소개하도록 하겠습니다.

 

1. Averaging Filter

cv2.blur(src, ksize)

1) src : 바꾸고 싶은 source 이미지

2) ksize : filter kernel 사이즈 (ex. (5,5))

 

2. Gaussian Filter

cv2.GaussianBlur(src, ksize, sigmaX, sigmaY)

1) src : 바꾸고 싶은 source 이미지

2) ksize : filter kernel 사이즈 (ex. (width, height) 홀수만 가능)

3) sigmaX, sigmaY : x, y 방향에 대한 가우시안 커널의 표준편차. 0으로 설정하면 자동 설정

 

3. Median Filter

cv2.medianBlur(src, ksize)

1) src : 바꾸고 싶은 source 이미지

2) ksize : filter kernel 사이즈 (ex. 3. 홀수만 가능)

 

4. Bilateral Filter

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)

1) src : 바꾸고 싶은 source 이미지

2) d : 계산할 주변 pixel까지의 거리

3) sigmaColor : 주변 pixel 값과의 영향. 클수록 주변 값의 영향을 많이 받음

4) sigmaSpace : 주변 pixel 거리와의 영향. 클수록 주변 픽셀에 영향을 많이 받음


예제

다양한 필터를 통해 이미지를 smoothing 시킵니다.

import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage import io

# Noise 추가하고 Gray로 변환하는 함수
def add_noise(image, mean, var):
    if len(image.shape) == 3:
        image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    row, col = image.shape
    sigma = var ** 3
    gauss = np.random.normal(mean, sigma, (row, col))
    gauss = gauss.reshape(row, col)
    noisy = image + gauss
    return np.uint8(noisy)

# Image Load
image = io.imread('Lenna.png')
# image = add_noise(image, mean=0, var=3.3)  # noise 추가시

kernel_size = 11
# Average
output1 = cv2.blur(image, (kernel_size, kernel_size))
# Gaussian
output2 = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
# Median
output3 = cv2.medianBlur(image, kernel_size)
# Bilateral
output4 = cv2.bilateralFilter(image, kernel_size, 75, 75)

output_list = [image, output1, output2, output3, output4]
name_list = ['Original', 'Average', 'Gaussian', 'Median', 'Bilateral']
# view
for i in range(len(output_list)):
    plt.subplot(2,3,(i+1))
    plt.imshow(output_list[i])
    # plt.imshow(output_list[i], cmap='gray')  # noise 추가시
    plt.title(name_list[i])
    plt.axis('off')
plt.show()

 

smoothing 함수를 사용하면 이미지가 흐려짐을 확인할 수 있다.

 

이미지에 노이즈가 있을때, smoothing 함수를 사용하면 주변픽셀과 함께 흐려지며 noise가 사라지는 것을 확인 할 수 있다.

728x90

'Image Processing (Python)' 카테고리의 다른 글

Gamma Correction (감마 보정)  (1) 2021.11.19
Embossing (엠보싱)  (0) 2021.11.18
Flip (대칭)  (0) 2021.11.16
Sharpening (샤프닝)  (1) 2021.11.15
Image Read (이미지 불러오기)  (0) 2021.11.11

댓글