본문 바로가기
Image Processing (Python)

Denoising (non-local)

by HanByol Jang 2021. 11. 23.
728x90

함수 설명

Denoising이란 말그대로 노이즈를 없애는 행위를 뜻합니다.

앞서 소개했던 Smoothing 방법 역시 noise를 없애주는 denoising 방법중 하나입니다.

 

https://hanstar4.tistory.com/24

 

Smoothing

함수 설명 이미지에 흐림효과를 주어 번져보이게 하는 함수입니다. 주로 이미지안에서 노이즈를 줄이거나 경계선을 흐리게 할 때 사용합니다. Smoothing filter에 따라 결과가 달라집니다. 주로 많

hanstar4.tistory.com

 

Smoothing에서 소개했던 방법들은 대상 픽셀을 둘러싸고 있는 픽셀 그룹의 평균값을 가지고 이미지를 부드럽게 만드는 방법들이었습니다. 이러한 방법들은 픽셀 주위의 다른 픽셀들을 활용하는 방법으로 자신의 이웃의 정보들만 가지고 처리를 한다는 단점이 있습니다. 

 

이와는 다르게 non-local denoising 방법은 주변이 아닌 이미지 안에서 작은 윈도우를 설정한 뒤 가장 유사한 윈도우 영역을 모두 찾아 평균을 취하고, 그 결과 값으로 픽셀 값을 교체합니다.

 

위의 그림에서 파란색 윈도우와 비슷한 부분들을 모두 찾은뒤 평균을 구한 값으로 대체합니다. 같은 방법으로 초록색 윈도우도 비슷한 부분으로 판단되는 부분을 모두 찾고 평균값으로 픽셀을 대체합니다.
이렇게 해당 픽셀 주변의 값만 활용하는 것이 아니고 전역적인 것이 특징이며, 다른 denoising 기법보다는 더 많은 시간이 걸리는 단점이 있으나 정확성이 높은 결과를 얻을 수 있습니다.


코드 설명

python OpenCV 라이브러리를 사용했습니다.

 

1. Gray 이미지

cv2.fastNlMeansDenoising(src, None, h, templateWindowSize, searchWindowSize)

 

2. Color 이미지

cv2.fastNlMeansDenoisingColored(src, None, h, hForColorComponents, templateWindowSize, searchWindowSize)

 

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

2) h : 필터의 강도

3) hForColorComponents : h와 동일한 요소. color이미지에서만 사용

4) templateWindowSize : 기준이 되어야하는 윈도우의 사이즈

5) searchWindowSize : 찾을 윈도우의 사이즈


예제

Noise를 이미지에 추가 후 denoising하는 예제입니다.

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
color_image = io.imread('Lenna.png')
gray_image = cv2.cvtColor(color_image, cv2.COLOR_RGB2GRAY)
noise_image = add_noise(gray_image, 0, 2.5)

# Denoising
output = cv2.fastNlMeansDenoising(noise_image, None, 10, 7, 21)

# view
plt.subplot(1,2,1)
plt.imshow(noise_image, cmap='gray')
plt.axis('off')
plt.title('Noise')
plt.subplot(1,2,2)
plt.imshow(output, cmap='gray')
plt.title('Denoising')
plt.axis('off')
plt.show()

Denoising 결과 noise가 확연히 사라진것을 확인 할 수 있습니다.

728x90

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

Edge Detection (윤곽선 검출)  (0) 2021.12.01
Rotate (회전)  (0) 2021.11.24
Color Space Change (색공간 변경)  (0) 2021.11.22
Gamma Correction (감마 보정)  (1) 2021.11.19
Embossing (엠보싱)  (0) 2021.11.18

댓글