OpenCV 기반 영상 추적 알고리즘 실습(1)

Yk Lee·2022년 6월 7일
0

AI영상인식실습

목록 보기
14/16

이미지 필터(1)

이미지의 노이즈를 개선하기 위한 이미지 필터 방법을 실습할 수 있다.

Gaussian Filter(Blur)
로컬 영역에 적용되는 가볍고 활용이 간편한 필터로 이미지의 노이즈를 개선하기 위하여 활용한다.

경계가 희미해 질 수 있다.

1X3 window로 중간단계 이미지 생성후, 3X1 window로 최종 이미지를 생성한다.
Local area의 정보만 활용하여 filtering을 수행한다.

horizontal Gauss filter
0,128,0에 있는 분홍색 필터가 우측으로 이동하면서 가운데 값을 절반으로 낮추어 주고 그 가운데 값의 양측에 1/4에 해당하는 값을 좌우 양쪽 픽셀에 더해주게 된다. 즉 0,128,0 -> 0,64,0 -> 32,64,32가 된다.
intermediate result를 봐보면 128적혀있던 부분들이 모두 32,64,32로 필터된것을 확인할 수 있다.

vertical Gauss filter
3X1 window의 가운데 값이 직혀 있을때 가운데 값을 마찬가지로 절반으로 떨어트리고, 양쪽 위 아래 픽셀 값을 1/4에 해당하는 값을 위 아래 픽셀에다 더해주게 된다.

OpenCV에서 다양한 filter를 제공한다.
Blur, Median Blur, Biateral Filter등이 있다.

실습

import cv2
from matplotlib import pyplot as plt

img = cv2.imread('lena.jpg')

# pyplot를 사용하기 위해서 BGR을 RGB로 변환함
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 일반 Blur
dst1 = cv2.blur(img,(5,5))

# GaussianBlur
dst2 = cv2.GaussianBlur(img,(5,5),0)

# Median Blur
dst3 = cv2.medianBlur(img,5)

# Bilateral Filtering, GaussianBlur에서 엣지가 뭉게지는 부분을 보안했다.
dst4 = cv2.bilateralFilter(img,9,75,75)

images = [img,dst1,dst2,dst3,dst4]
titles=['Original','Blur(7X7)','Gaussian Blur(5X5)','Median Blur','Bilateral']

for i in range(5):
    print(i)
    plt.figure(i+1),plt.imshow(images[i]),plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

plt.show()

결과는 위에 사진과 같이 나온다.

이미지필터(2)

Non Local Means Filter
필터링 영역 인근의 유사한 영역을 찾아 유사 영역의 픽셀 평균값을 계산하고 이 값으로 대처하여 노이즈를 제거하는 필터로
Local 영역 데이터만 활용한 Flitering 기법보다 나은 선능을 보여주나 연삭 속도가 느리다.

파란색 테두리 안에 있는 점을 없애고 싶을때 파란색 박스가 그려진 3가지 영역을 평균을 잡아서 그 값으로 파란색 영역을 대처해 버려 노이즈를 제거한다. 즉 필터링하고자 하는 영역과 유사한 곳을 찾아 평균값으로 대처해 버리는 것이다.

OpenCV에서 제공하는 4가지 함수
Cv2.fastNIMeansDenoising():흑백 이미지 용 필터
Cv2.fastNIMeansDenoisingColored(): 칼라 이미지 용 필터
Cv2.fastNIMeansDenoisingMulti(): 연속적인 흑백 이미지 혹은 흑백 동영상용 필터
Cv2.fastNIMeansDenoisingColoredMulti(): 연속적인 칼라 이미지 혹은 칼라 동영상용 필터

실습

import cv2
from matplotlib import pyplot as plt

# img = cv2.imread('lena_noisy.png')
# dst = cv2.fastNlMeansDenoising(img,h=15)

img = cv2.imread('landscape_noisy.jpg')
dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)

plt.figure(1),plt.imshow(img)
plt.figure(2),plt.imshow(dst)
plt.show()


최종정리
이미지 필터는 크게 2가지가 있다.
Gaussian Filter
이미지의 로컬 영역 정보로 노이즈를 개선해 주는 간단한 필터이며 이미지에 Blur 효과가 발생한다.
Non Local Means Filter
필터링 수행하는 영역 인근에서 유사한 영역을 찾고 이들의 픽셀 평균값으로 기존 영역을 대체하여 노이즈를 제거한다. Local 영역 데이터만 활용한 Filtering 기법보다 나은 성능을 보여주나 연산속도가 느리다.

profile
AR개발자지망생

0개의 댓글