segmentation 주요 목표는 하나 이상의 특성 또는 특징과 관련하여 동질적인 영역(클래스 또는 하위집합)으로 이미지를 분할하는 것
segmentation은 의학적 이미지 프로세싱과 많은 어플리케이션에 쓰이는 중요한 도구이다.
분석된 이미지의 특성에 대한 다양한 가정은 다양한 알고리즘의 사용으로 이어짐
세그멘테이션 종류(아래 링크 참조)
세그멘테이션)
출처 : https://www.geeksforgeeks.org/region-and-edge-based-segmentaion/
Thresholding(스레시 홀딩)
1 : black , 0 : white
오츠의 알고리즘)
임계값을 임의로 정해 픽셀을 두 부류로 나누고 두 부류의 명암 분포를 구하는 작업 반복하여 두 부류의 명암 분포가 가장 균일할 때의 임계값 선택
스레시 홀딩 코드)
# 스레시홀딩 플래그 (threshold_flag.py)
import cv2
import numpy as np
import matplotlib.pylab as plt
img = cv2.imread('../img/gray_gradient.jpg', cv2.IMREAD_GRAYSCALE)
_, t_bin = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
_, t_bininv = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
_, t_truc = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
_, t_2zr = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
_, t_2zrinv = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
imgs = {'origin':img, 'BINARY':t_bin, 'BINARY_INV':t_bininv, \\
'TRUNC':t_truc, 'TOZERO':t_2zr, 'TOZERO_INV':t_2zrinv}
for i, (key, value) in enumerate(imgs.items()):
plt.subplot(2,3, i+1)
plt.title(key)
plt.imshow(value, cmap='gray')
plt.xticks([]); plt.yticks([])
plt.show()
오츠의 알고리즘을 적용한 스레시홀딩 (threshold_otsu.py)
import cv2
import numpy as np
import matplotlib.pylab as plt
# 이미지를 그레이 스케일로 읽기
img = cv2.imread('../img/scaned_paper.jpg', cv2.IMREAD_GRAYSCALE)
# 경계 값을 130으로 지정 ---①
_, t_130 = cv2.threshold(img, 130, 255, cv2.THRESH_BINARY)
# 경계 값을 지정하지 않고 OTSU 알고리즘 선택 ---②
t, t_otsu = cv2.threshold(img, -1, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
print('otsu threshold:', t) # Otsu 알고리즘으로 선택된 경계 값 출력
imgs = {'Original': img, 't:130':t_130, 'otsu:%d'%t: t_otsu}
for i , (key, value) in enumerate(imgs.items()):
plt.subplot(1, 3, i+1)
plt.title(key)
plt.imshow(value, cmap='gray')
plt.xticks([]); plt.yticks([])
plt.show()
초점이 맞지 않는 카메라처럼 영상의 경계가 흐릿해지는 효과