Gaussian Smooting Flitering과 Median Filtering

정다은_Danea·2025년 3월 17일

VISION

목록 보기
4/4
post-thumbnail

이번 포스팅에서는 Gaussian Smoothing Filtering과 Median Filtering에 대해 포스팅 해보려고 한다.

에지 디텍션을 진행할 때 2가지의 블러링 기법에 대해 공부했었다.

1. Gaussian Smoothing Filtering란

영상 처리에서 노이즈 제거 및 블러링 효과를 위해 사용되는 필터링 기법.

  • 변화율이 작은 부분은 유지하고, 변화율이 큰 부분은 작게 만들어 영상을 부드러워지게 하는 효과
  • 가우시안 함수를 표본화 -> 가우시안 필터의 계수
  • 커널의 크기에 따라 스무딩 정도가 달라지는데 본인은 3x3 마스크를 사용했다. (5x5, 7x7 마스크도 있다. 해당 마스크의 계수는 구글링 해보면 나온다.)


이러한 가우시안 함수를 기반으로 계수가 정해진다.

3x3 마스크의 계수

2. 마스크를 이미지에 적용하는 방법 (내가 했던 방법)


2중 반복문과 행렬 연산을 사용한다.

3. 가우시안 필터링 적용 결과

에지 검출을 하기 위해 가우시안 필터링을 진행한 모습이다. (연구 때 했던 작업물)

에지 검출은 결국 영상에서 외곽선을 따는 작업인데, 여기에서 사진이 너무 선명하다면 컴퓨터가 찾아낸 에지들이 너무 많아진다. 그렇기 때문에 가장 큰 부분들만 인식할 수 있도록 필터링을 해주는 것이다.

가우시안 필터링을 하는 방법은 무척 간단하다.
(사실 상하좌우 1씩 패딩 줘야하는데 여기서는 그냥 진행했다...)

패딩 주는 법은 간단하다.
가우시안 이미지를 초기화 할 때 가로 세로 +2씩 해주고, 차후 2개의 반복문에서 인덱스를 변한 것에 맞게 조정해주면 된다. 그러니까

Gauimg = np.zeros((Row+2, Col+2))
row = 1
while row < Row - 1:
	col = 1
    while col < Col - 1:
    	value = 0
        value += Gaussianmask[0][0] * img[row - 1][col - 1] + Gaussianmask[0][1] * img[row - 1][col] + Gaussianmask[0][2] * img[row - 1][col + 1] + Gaussianmask[1][0] * img[row][col - 1] + Gaussianmask[1][1] * img[row][col] + Gaussianmask[1][2] * img[row][col + 1] + Gaussianmask[2][0] * img[row + 1][col - 1] + Gaussianmask[2][1] * img[row + 1][col] + Gaussianmask[2][2] * img[row + 1][col + 1]
        value /= 16
        Gauimg[row][col] = value
        col += 1
    row += 1

이렇게 하면 된다. (어쩌다 보니 코드를 완성했다.)

4. 가우시안 필터링 구현

import cv2
import numpy as np
import math

img = cv2.imread("newroad.jpg", 0)
Row, Col = img.shape

Gaussianmask = [[1, 2, 1], [2, 4, 2], [1, 2, 1]]
Gauimg = np.zeros((Row, Col))
row = 1
while row < Row-1:
    col = 0
    while col < Col-1:
        value = 0
        value += Gaussianmask[0][0] * img[row - 1][col - 1] + Gaussianmask[0][1] * img[row - 1][col] + Gaussianmask[0][2] * img[row - 1][col + 1] + Gaussianmask[1][0] * img[row][col - 1] + Gaussianmask[1][1] * img[row][col] + Gaussianmask[1][2] * img[row][col + 1] + Gaussianmask[2][0] * img[row + 1][col - 1] + Gaussianmask[2][1] * img[row + 1][col] + Gaussianmask[2][2] * img[row + 1][col + 1]
        value /= 16
        Gauimg[row][col] = value
        col += 1
    row += 1
print("Gaussian complete")
  1. 이미지 파일을 가져온다
  2. 이미지의 가로 픽셀 1수와 세로 픽셀 수를 변수에 저장한다
  3. 이중 리스트에 가우시안 마스크를 만들어 놓는다.
  4. 가우시안 필터링이 적용될 이미지를 원본 이미지의 가로 세로 크기에 맞추어 빈 값으로 지정한다.
  5. 앞서 설명한 방법에 따라, 전체 픽셀에 대해 진행한다.

5. Median Filtering이란

당시 노이즈를 제거하려고 했을 때 이 기법을 사용해보았다. (스테레오 매칭에서 노이즈를 줄이는 방법으로 여러 필터링 방법을 시도해봤었다.)

이 기법은 salt & pepper noise에 가장 효과적이다.

  • 이미지 내 특정 픽셀의 값을 주변 픽셀 값들의 중앙값(Median) 으로 대체하여 처리하는 방식이다.
    (Mean Filtering은 특정 픽셀을 주변 픽셀 값들의 평균으로 대체하는 방식인데, 효과가 별로 좋지 않다. 우리가 집단 분석을 진행할 때, 평균이 아닌 중앙값을 계산했을 때 훨씬 그 집단의 특성을 잘 알 수 있는 것과 같은 이치이다.)

처음 이 필터링을 했을 때는 무척이나 신기했다. 흰색과 검은색의 점들이 말끔하게 사라지고 이질감 또한 들지 않아서.

6. Meidan Filtering 알고리즘

미디언 필터링의 알고리즘은 아까 살짝 언급했듯, 이미지 내의 특정 픽셀의 값을 주변 픽셀 값들의 중앙값으로 대체하는 것이다. 그렇다면 그 과정을 거치기 위한 자세한 로직은 어떻게 될까?

  1. 마스크의 크기를 정한다. (본인은 3x3으로 진행함.)
  2. 해당 영역의 값들을 (9개) 크기순으로 정렬한다.
    (정렬 알고리즘은 원하는 것을 사용. 본인은 파이썬 기본 함수를 사용했다)
  3. 5번째 값을 마스크의 중간에 위치한 픽셀에 넣는다
  4. 전체 픽셀에 대해 수행한다.

이 필터링들이 복잡한 내용이 아니어서 이번 포스팅은 짧게 끝났다.

profile
IT 개발 기록장 web, app, vision, ai, git, etc. https://github.com/0JDaEun

0개의 댓글