상세 컨텐츠

본문 제목

OpenCV의 다양한 필터

영상처리/OpenCV Python

by cepiloth 2021. 5. 25. 12:05

본문

728x90
반응형

평균 값 필터(Mean filter)

영상의 특정 좌표 값을 주변 픽셀 값들의 산술 평균으로 설정
픽셀들 간의 그레이스케일 값 변화가 줄어들어 날카로운 에지가 무뎌지고, 영상에 있는 잡음의 영향이 사라지는 효과

실제 영상에 평균 값 필터를 적용한 결과

마스크 크기가 커질수록 평균 값 필터 결과가 더욱 부드러워지나 TRADE OFF 관계로 더 많은 연산량이 필요하다.

#OpenCV 평균 값 필터링 함수

/*
src : 입력 영상
ksize : 평균값 필터 크기. (width, height) 형태의 튜플
dst : 결과 영상, 입력 영상과 같은 크기 & 같은 타입.
*/
cv2.blur(src. ksize, dst=None, anchor=None, borderType=None) -> dst

 

가우시안 필터

평균값 필터에 의한 블러링의 단점
필터링 대상 위치에서 가까있는 픽셀과 멀리 있는 픽셀이 모두 같은 가중치를 사용하여 평균을 계산 멀리 있는 픽셀의 영향을 많이 받을 수 있다.

 

(1차원) 가우시안 함수 (Gaussian function)

 

2차원 가우시안 함수

- 2차원 가우시안 필터마스크 (𝜎 = 1.0)
필터 마스크 크기: 8𝜎 + 1 또는 6𝜎 + 1

#OpenCV 가우시안 필터링 함수

/*
src : 입력 영상. 각 채널 별로 처리됨.
dst : 출력 영상. src와 같은 크기, 같은 타입.
ksize : 가우시안 커널 크기. (0, 0)을 지정하면 sigma 값에 의해 자동 결정됨.
sigmaX : x 방향 sigma
sigmaY : y 방향 sigma. 0 이면 sigmaX와 같게 설정
borderType: 가장 자리 픽셀 확장 방식.
*/
cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None) -> dst

 

다양한 크기의 sigma를 사용한 가우시안 필터링 실행 결과

 

언샤크 마스크(Unsharp mask) 필터링

날카롭지 않은(unsharp) 영상, 즉, 부드러워진 영상을 이용하여 날카로운 영상을 생성

#그레이 영상에 적용하기
import sys
import numpy as np
import cv2

src = cv2.imread('rose.bmp', cv2.IMREAD_GRAYSCALE)

if src is None:
    print('Image load failed!')
    sys.exit()

blr = cv2.GaussianBlur(src, (0, 0), 2)
dst = np.clip(2.0*src - blr, 0, 255).astype(np.uint8)

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()

cv2.destroyAllWindows()

#컬러 영상에 적용하기
import sys
import numpy as np
import cv2

src = cv2.imread('rose.bmp')

if src is None:
    print('Image load failed!')
    sys.exit()

src_ycrcb = cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)

src_f = src_ycrcb[:, :, 0].astype(np.float32)
blr = cv2.GaussianBlur(src_f, (0, 0), 2.0)
src_ycrcb[:, :, 0] = np.clip(2. * src_f - blr, 0, 255).astype(np.uint8)

dst = cv2.cvtColor(src_ycrcb, cv2.COLOR_YCrCb2BGR)

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()

cv2.destroyAllWindows()

 

영상의 잡음(Noise)

영상의 픽셀값에 추가되는 원치 않는 형태의 신호

잡음의 종의 종류 : 가우시안 잡음(Gaussian noise), 소금&후츠 잡음(Salt&Pepper)

 

잡음 제거(1): 미디언 필터

주변 픽셀들의 값들을 정렬하여 그 중앙값(median)으로 픽셀 값을 대체 소금-후추 잡음 제거에 효과적dlek.

#OpenCV 미디언 필터링 함수

/*
src : 입력 영상. 각 채널 별로 처리됨
ksize : 커널 크기. 1보다 큰 홀수를 지정.
dst : 출력 영상. src와 같은 크기, 같은 타입.
*/
cv2.medianBlur(src, ksize, dst=None) -> dst
cv2.medianBlur(src, 3)

 

잡음 제거(1) : 가우시안 필터

가우시안 잡음 제거에는 가우시간 필터가 효과적이다.

 

잡음 제거(2): 양방향 필터

- 양방향 필터(Bilateral filter)
 엣지 보존 잡음 제거 필터(edge-preserving noise removal filter)의 하나로 평균 값 필터 또는 가우시안 필터는 에지 부근에서도 픽셀 값을 평탄하게 만드는 단점이 있음 기준 픽셀과 이웃픽셀과의 거리, 그리고 픽셀 값의 차이를 함께 고려하여 블러링 정도를 조절한다.

 

(일반적인) 가우시간 필터링: 영상 전체에서 blurring을 적용한다.

 

양방향 필터 : 엣지가 아닌 부분에서만 blurring을 적용한다.

 

#OpenCV 양방향 필터링 함수

/*
src : 입력 영상. 8비트 또는 실수형, 1채널 또는 3채널.
d: 필터링에 사용될 이웃 픽셀의 거리(지름). 음수(-1)를 입력하면 sigmaSpace 값에 의해 자동 결정됨.
sigmaColor : 색 공간에서 필터의 표준 편차
sigmaSpace : 좌표 공간에서 필터의 표준 편차
dst : 출력 영상. src와 같은 크기, 같은 타입.
borderType : 가장자리 픽셀 처리 방식
*/
cv2.bilateralFilter(src, d sigmaColor, sigmaSpace, dst=None, borderType=None) -> dst
src = cv2.imread('lenna.bmp')
dst = cv2.bilateralFilter(src, -1, 10, 5)

728x90
반응형

관련글 더보기

댓글 영역