Skip to main content

이미지 이진화

히스토그램을 이용한 이진화

  • 색상을 흑과 백 2가지만으로 바꾸는 것(이진화)
    # 파일 열기
    src = cv.imread('newspaper.png', cv.IMREAD_GRAYSCALE)
    hist = cv.calcHist([src], [0], mask=None, histSize=[256], ranges=[0, 256])
  • 190을 문턱값으로 설정하여
  • 0-190 사이는 검은 색, 190-255는 흰색으로 이진화
    th, bin = cv.threshold(src, 190, 255, cv.THRESH_BINARY)
    show(bin)

이진화 방법

  • cv.THRESH_BINARY: 임계값 이상 = 최댓값, 임계값 이하 = 0
  • cv.THRESH_BINARY_INV: 위의 반전
  • cv.THRESH_TOZERO: 임계값 이하만 0으로
  • cv.THRESH_TOZERO_INV: 위의 반전
  • cv.THRESH_TRUNC: 임계값 이상만 임계값으로

오츠의 이진화 알고리즘

  • 모든 임계값 중에서 명암 분포가 가장 균일한 것을 자동으로 선택하는 알고리즘
    th, bin = cv.threshold(src, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    show(bin)

    th # 문턱값(=169)

global thresholding의 문제

  • 조명이 일정하지 않거나 배경색이 여러 개이면 하나의 문턱값으로 구분할 경우 문제가 됨
    src = cv.imread('sudoku.png', cv.IMREAD_GRAYSCALE)
    th, bin = cv.threshold(src, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
  • 전반적으로 밝은 부분은 모두 문턱값 위로, 전반적으로 어두운 부분은 모두 문턱값 아래로 처리될 수 있음

Adaptive Thresholding

  • 이미지를 여러 개의 블록으로 나누어 이진화
    block_size = 15 # 주변 15픽셀을 참고
    C = 5 # 가감할 상수
    # 주변 픽셀의 평균을 이용: 선명하지만 노이즈
    adap2 = cv.adaptiveThreshold(
    src, 255, cv.ADAPTIVE_THRESH_MEAN_C,
    cv.THRESH_BINARY, block_size, C)
    # 가우시안 분포를 이용: 노이즈가 적음
    adap3 = cv.adaptiveThreshold(
    src, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C,
    cv.THRESH_BINARY, block_size, C)