[OpenCV] 이미지 임계값

12569 단어 pythonTILopencvTIL

전역 임계값

임계값 규칙이 이미지의 모든 픽셀에 동일하게 적용되고 임계값이 고정되면, 전역이라고 한다.

전역 임계값 지정 알고리즘은 원본 이미지(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)

결과


좋은 웹페이지 즐겨찾기