Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상에 필터링 적용하기 - cv2.filter2D

AI 꿈나무 2020. 9. 30. 14:34
반응형

황선규 박사님의 <OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝>, OpenCV 강의를 공부한 내용을 정리했습니다.

 


영상에 필터링 적용하기

 영상의 필터링(image filtering)은 영상에서 필요한 정보만 통과시키고 원치 않는 정보는 걸러내느 작업이빈다.

 

1. 필터링 종류

 필터링 작동 방법은 크게 두 가지로 나눌 수 있습니다.

 

(1) 주파수 공간에서의 필터링 (Frequency domain filtering)

 

 

 주파수 값을 이용하는 필터링 방법입니다.

 

 영상에서 주파수 값을 추출하는 FFT를 거쳐서 추출한 값과 설정한 관심영역을 곱하는 IFFT를 통해 주파수 필터링이 작용합니다.

 

(2) 공간적 필터링(Spatial domain filtering)

 영상의 픽셀 값을 직접 이용하는 필터링 방법입니다.

 

 대상 좌표의 픽셀 값과 주변 픽셀 값을 동시에 사용합니다.

 

 주로 마스크연산을 이용합니다. (마스크 = 커널(kernel) = 윈도우(window) = 템플릿(template))

 

 주로 공간적 필터링이 이용됩니다.

 

2. 필터링 작동 방법

 다양한 모양과 크기의 마스크를 이용합니다.

 

 

 Anchor은 고정점을 의미합니다.

 

 마스크의 형태와 값에 따라 필터의 역할이 결정 됩니다. (영상 부드럽게 만들기, 영상 날카롭게 만들기, 에지(egge) 검출, 잡음 제거)

 

(1) 3X3 크기의 마스크를 이용한 공간적 필터링

 

 

 

2차원 Convolution 마스크 계산 식

 

 3X3 마스크에서는 9개의 (마스크 값 X 마스크에 해당하는 픽셀의 값)을 모두 더한 것이 해당 픽셀 값이 됩니다.

 

(2) 가장자리 픽셀 확장 방법

 가장자리 픽셀은 주변 픽셀이 없기 때문에 필터링을 하기가 곤란합니다.

 

 최외곽 바깥에 가상의 픽셀이 있다고 가정하여 필터링을 진행합니다. (픽셀 확장)

 

 OpenCV 필터링에서 지원하는 가장자리 픽셀 확장 방법입니다.

 

 

 주로 BORDER_REFLECT_101 을 이용합니다.

 

3. 기본적인 2D 필터링 - cv2.filter2D

 OpenCV에서 제공하는 cv2.filter2D()함수로 기본적인 2D 필터링을 할 수 있습니다.

 

[함수 설명]

cv2.filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None) -> dst

• src : 입력 영상

• ddepth : 출력 영상 데이터 타입. (e.g) cv2.CV_8U, cv2.CV_32F, cv2.CV_64F, -1을 지정하면 src와 같은 타입의 dst 영상을 생성합니다.

• kernel: 필터 마스크 행렬. 실수형.

• anchor: 고정점 위치. (-1, -1)이면 필터 중앙을 고정점으로 사용

• delta: 추가적으로 더할 값

• borderType: 가장자리 픽셀 확장 방식

• dst: 출력 영상

 

[예제 코드]

 cv2.fliter2D 함수를 사용해서 평균 값 필터를 적용해보겠습니다.

 

 평균값 필터는 영상의 특정 좌표 값을 주변 픽셀 값들의 산술 평균으로 설정하는 필터입니다.

 픽셀들 간의 그레이스스케일 값 변화가 줄어들어 날카로운 에지가 무뎌지고, 영상에 있는 잡음의 영향이 사라지는 효과가 있습니다.

 

# 영상 불러오기
src = cv2.imread('rose.bmp', cv2.IMREAD_GRAYSCALE)

if src is None:
    print('image load failed!')
    sys.exit()
    
# 필터 마스크 생성
kernel = np.ones((3, 3), dtype=np.float64) / 9. # 9.이 실수이므로 자동으로 float로 설정되지만 데이터 타입을 지정해주었습니다.
dst = cv2.filter2D(src, -1, kernel) # -1은 입력 영상과 동일한 데이터의 출력 영상 생성

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

 

기존 영상
필터링 적용 영상

 

 평균값 필터링이 적용되었습니다.

 

반응형