황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다.
예제 코드 출처 : 황선규 박사님 github홈페이지
영상의 이진화 - Binarization
영상의 이진화는 영상의 픽셀 값을 0 또는 255(1)로 만드는 연산입니다.
0은 검정색, 255는 흰색을 의미합니다.
이진화를 하는 이유는 1. 배경과 객체를 구분, 2. 관심 영역과 비관심 영역 구분 입니다.
마스크 영상도 이진 영상의 한 형태라고 볼 수 있습니다.
1. 그레이스케일 영상의 이진화
그레이스케일 영상의 이진화는 픽셀 값이 임계값을 넘으면 0(검은색) 임계값 보다 낮으면 255(흰색)으로 표현합니다.
영상의 히스토그램을 보았을 때 픽셀 값이 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를 입력해주면 됩니다.
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()
이처럼 이진 영상을 제작할 수 있습니다.
감사합니다.
'Python > 파이썬 OpenCV 공부' 카테고리의 다른 글
[파이썬 OpenCV] 이진 영상 처리 - 지역 이진화 - cv2.adaptiveThreshold (0) | 2020.10.10 |
---|---|
[파이썬 OpenCV] 이진 영상 처리 - 자동 이진화 - Otsu 방법 (0) | 2020.10.10 |
[파이썬 OpenCV] 동전 카운터 - cv2.HoughCircles (0) | 2020.10.09 |
[파이썬 OpenCV] 영상에서 원 검출하기 - 허프 변환 원 검출 - cv2.HoughCircles (0) | 2020.10.09 |
[파이썬 OpenCV] 영상에서 직선 검출하기 - 허프 변환 직선 검출 - cv2.HoughLines, cv2.HoughLinesP (1) | 2020.10.09 |