[OpenCV] 이미지 임계값
전역 임계값
임계값 규칙이 이미지의 모든 픽셀에 동일하게 적용되고 임계값이 고정되면, 전역이라고 한다.
전역 임계값 지정 알고리즘은 원본 이미지(src)와 임계값(threshold)을 입력으로 사용하고 소스 픽셀 위치(x,y)의 픽셀 강도를 임계값과 비교하여 출력 이미지(dst)를 생성한다. src(x,y) > threshold
이면 dst(x,y)에 일부 값이 할당된다. 그렇지 않으면 dst(x,y)에 다른 값이 할당된다.
가장 간단한 형태의 전역 임계값은 이진 임계값 처리라고 한다.
- 소스 이미지(src) 및 임계값(threshold) 외에도 최대값(maxValue)이라는 또 다른 입력 매개 변수를 사용한다.
- 각 픽셀 위치(x,y)에서 해당 위치의 픽셀 강도는 임계값, thresh와 비교된다.
src(x,y)가 임계값보다 크면 임계값 지정 작업은 대상 영상 픽셀 dst(x,y)의 값을 maxValue로 설정한다. 그렇지 않으면 아래 의사 코드에 표시된 것처럼 0으로 설정된다.
if src(x,y) > thresh
dst(x,y) = maxValue
else
dst(x,y) = 0
임계값 알고리즘은 dst(x,y)를 얻기 위해 src(x,y)에 적용되는 임계값 규칙에 따라 달라진다. OpenCV에서 사용할 수 있는 5가지 임계값 유형을 알아보자.
입력 이미지
입력 이미지에는 숫자와 동일한 강도(회색조 값)로 작성된 숫자가 포함되어 있습니다. 예를 들어 숫자 200
의 픽셀 강도는 200이고 숫자 32
의 강도는 32입니다. '32'가 '200'보다 훨씬 더 어둡게 나타나는 이유이다.
이진 임계값
임계값 규칙
# 이진 임계값
if src(x,y) > thresh
dst(x,y) = maxValue
else
dst(x,y) = 0
코드
import cv2
# 이미지 읽기
src = cv2.imread("threshold.png", cv2.IMREAD_GRAYSCALE)
# 임계값 및 maxValue 설정
thresh = 127
maxValue = 255
# 기본 임계값
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY)
결과
thresh를 127로 주면 127보다 작거나 같은 숫자들은 안보이게 된다.
역 이진 임계값
역 이진 임계값은 이진 임계값의 반대이다. 역 이진 임계값의 대상 픽셀은 다음과 같다.
- 0, 해당 소스 픽셀이 임계값보다 큰 경우
- maxValue, 소스 픽셀이 임계값보다 작은 경우
임계값 규칙
# 역 이진 임계값
if src(x,y) > thresh
dst(x,y) = 0
else
dst(x,y) = maxValue
코드
import cv2
# 이미지 읽기
src = cv2.imread("threshold.png", cv2.IMREAD_GRAYSCALE)
# 임계값 및 maxValue 설정
thresh = 127
maxValue = 255
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY_INV)
결과
임계값 자르기 - THRESH_TRUNC
이러한 유형의 임계값은
- 소스 픽셀 값이 임계값보다 크면 대상 픽셀이 임계값으로 설정된다.
- 그렇지 않으면 소스 픽셀 값으로 설정된다.
- maxValue는 무시된다.
임계값 규칙
# 임계값 자르기
if src(x,y) > thresh
dst(x,y) = thresh
else
dst(x,y) = src(x,y)
코드
import cv2
# 이미지 읽기
src = cv2.imread("threshold.png", cv2.IMREAD_GRAYSCALE)
# 임계값 및 maxValue 설정
thresh = 127
maxValue = 255
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TRUNC)
결과
임계값(127)을 초과하는 모든 값은 127로 설정됐고, 임계값 보다 작거나 같은 값은 변경되지 않았다. maxValue 무시됐다.
임계값 0 - THRESH_TOZERO
이러한 유형의 임계값은
- 소스 픽셀 값이 임계값보다 큰 경우 대상 픽셀 값은 해당 소스의 픽셀 값으로 설정된다.
- 그렇지 않을 경우엔 0으로 설정된다.
- maxValue는 무시된다.
임계값 규칙
# 임계값 0
if src(x,y) > thresh
dst(x,y) = src(x,y)
else
dst(x,y) = 0
코드
import cv2
# 이미지 읽기
src = cv2.imread("threshold.png", cv2.IMREAD_GRAYSCALE)
# 임계값 및 maxValue 설정
thresh = 127
maxValue = 255
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO)
결과
역 임계값 0 - THRESH_TOZERO_INV
역 임계값을 0으로
- 소스 픽셀 값이 임계값보다 큰 경우 대상 픽셀 값은 0으로 설정된다.
- 그렇지 않으면 소스 픽셀 값으로 설정된다.
- maxValue는 무시된다
임계값 규칙
# 역 임계값 0
if src(x,y) > thresh
dst(x,y) = 0
else
dst(x,y) = src(x,y)
코드
import cv2
# 이미지 읽기
src = cv2.imread("threshold.png", cv2.IMREAD_GRAYSCALE)
# 임계값 및 maxValue 설정
thresh = 127
maxValue = 255
th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO_INV)
결과
Author And Source
이 문제에 관하여([OpenCV] 이미지 임계값), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rlath/OpenCV-이미지-임계값저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)