Image Thresholding

Xpert·2024년 3월 9일
0

Computer Vision

목록 보기
8/10

이미지 이진화는 일반적으로 이미지 전체를 0과 1(또는 255)로 구성된 binary image로 만드는 작업을 말한다. 노이즈 제거, 백그라운드 제거 등에 사용될 수 있다.

히스토그램을 만들고 적당한 기준 값을 구한 뒤 이보다 크면 1, 작으면 0으로 처리하는 것이다.
히스토그램 분포가 bimodal distribution 일수록 잘 동작한다

Binary Thresholding

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('gradient.jpeg',0)

ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

cv2.threshold에서 2번째 인자는 임계 값이고 3번째 인자는 임계값을 넘었을때 적용되는 값이다
아래는 사용될 수 있는 옵션들이다

  • TRUNC : 일정 값보다 크면 Value로 고정하고, 작으면 원래 값 유지
  • TOZERO : 일정 값보다 크면 원래 값 유지하고, 작으면 0

Adaptive Thresholding

Global하게 thresholding하지 않고, Local하게 임계 처리 적용
이 방식이 항상 좋은 것은 아니고, 이미지 특성이 지역적인 이진화에 보다 유리할때 효과가 좋다

cv2.adaptiveTreshold()

Adaptive Method를 적용할 수 있다

  • cv2.ADAPTIVE_THRESH_MEAN_C : 주변영역의 평균값
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C : 가우시안 분포에 따른 가중치의 합


가우시안의 특징 때문에 Mean에 비해 노이즈는 덜하지만 선명도는 떨어진다.

OTSU

  1. 임계값을 임의로 정해 픽셀을 두 부류로 나눈다
  2. 두 부류의 명암 분포를 구하는 작업을 반복한다
  3. 모든 경우의 수 중에서 두 부류의 명암 분포가 가장 균일할 때의 임계값을 선택
img = cv2.imread('../img/scaned_paper.jpg', cv2.IMREAD_GRAYSCALE)       
t, t_otsu = cv2.threshold(img, -1, 255,  cv2.THRESH_BINARY | cv2.THRESH_OTSU) 

OTSU는 자동으로 threshold를 찾아주기 때문에 T값은 아무거나 넣어도 상관없다.
trial and error 류의 알고리즘이므로 반복 때문에 처리 속도는 상대적으로 느리다.

profile
Python, CV, ML, Backend

0개의 댓글

관련 채용 정보