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개의 댓글

Powered by GraphCDN, the GraphQL CDN