Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 이진화 - cv2.threshold

AI 꿈나무 2020. 10. 10. 16:43
반응형

황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다.

 

예제 코드 출처 :  황선규 박사님 github홈페이지

 

『OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝』

예제 소스 코드는 아래 링크를 참고하세요

sunkyoo.github.io


영상의 이진화 - Binarization

 영상의 이진화는 영상의 픽셀 값을 0 또는 255(1)로 만드는 연산입니다.

 0은 검정색, 255는 흰색을 의미합니다.

 

 이진화를 하는 이유는 1. 배경과 객체를 구분, 2. 관심 영역과 비관심 영역 구분 입니다.

 마스크 영상도 이진 영상의 한 형태라고 볼 수 있습니다.

 

1. 그레이스케일 영상의 이진화

 그레이스케일 영상의 이진화는 픽셀 값이 임계값을 넘으면 0(검은색) 임계값 보다 낮으면 255(흰색)으로 표현합니다.

 

출처: https://darkpgmr.tistory.com/115

 

 영상의 히스토그램을 보았을 때 픽셀 값이 100, 150 두 지점에 모여있는 것을 확인할 수 있습니다.

 임계값을 130로 설정한다면 두 지점을 구분할 수 있습니다.

 

 이처럼 히스토그램을 보고 적절한 임계값을 설정하는 것이 중요합니다.

 

2. 임계값 함수 - cv2.threshold

cv2.threshold(src, thresh, maxval, type, dst=None) -> retval, dst

• src: 입력 영상. 다채널, 8비트 또는 32비트 실수형
• thresh: 사용자 지정 임계값
• maxval: cv2.THRESH_BINARY 또는 cv2.THRESH_BINARY_INV 방법 사용 시 최댓값. 보통 255로 지정.
• type: cv2.THRESH_ 로 시작하는 플래그. 임계값 함수 동작 지정 또는 자동 임계값 결정 방법 지정
• retval: 사용된 임계값
• dst: 출력 영상. src와 동일 크기, 동일 타입, 같은 채널 수

 영상의 이진화 뿐만 아니라 모든 임계값을 지원하는 함수입니다.

 maxval는 255를 입력해 주는 것이 좋습니다.

 이진화를 하고 싶으면 type 인자에 cv2.THRESH_BINARY 나 cv2.THRESH_BINARY_INV를 입력해주면 됩니다.

 

type인자

 

 TRUNK는 임계값 보다 크면 임계값으로 지정하고, 낮으면 배경영상을 그대로 이용합니다.

 TOZERO는 임계값보다 크면 배경영상, 낮으면 검은색을 출력합니다.

 TOZERO_INV는 임계값보다 작으면 배경영상 크면 검은색을 출력합니다.

 TRHESH_NINARY와 THRESH_BINARY_INV 이 두 가지를 제일 많이 이용합니다. 

 

 주의할 점은 임계값 함수는 두 개의 결과값을 반환한다는 것입니다.

 retval과 dst값을 반환하므로 dst값을 이용하고 싶으면 _, dst로 값을 받아야 합니다.

 

3. 영상의 이진화 예제 코드

 예제코드는 황선규박사님의 깃허브를 참고했습니다. sunkyoo.github.io/opencv4cvml/

 

src = cv2.imread('cells.png', cv2.IMREAD_GRAYSCALE)

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

# 트랙바 함수 정의
def on_threshold(pos):
    _, dst = cv2.threshold(src, pos, 255, cv2.THRESH_BINARY)
    cv2.imshow('dst', dst)
    
cv2.imshow('src', src)
cv2.namedWindow('dst')
cv2.createTrackbar('Threshold', 'dst', 0, 255, on_threshold) # 임계값 범위 0~255
cv2.setTrackbarpos('Threshold', 'dst', 128) # 임계값 초기값 128

cv2.waitKey()
cv2.destroyAllWindows()

 

 

 

 

 이처럼 이진 영상을 제작할 수 있습니다.

 

 감사합니다.

 

반응형