In [1]:
from Custom.mediahelper import show_image_with_pil # 개발자 정의 모듈
from Custom.mediahelper import show_video_as_html # 개발자 정의 모듈
13_2. 이미지 변형(이진화)¶
Adaptive Threshold¶
이미지를 작은 영역으로 나누어서 임계치 적용
적응형 이진화 동작:
입력 이미지의 작은 영역(block_size)마다 평균을 계산하고, 해당 평균에서 c를 뺀 값을 기준으로 이진화를 수행.
지역적으로 조정되므로 조명 변화가 있는 이미지에서도 효과적.
In [2]:
import cv2
import numpy as np
def empty(pos):
#print(pos)
pass
img = cv2.imread('../Media/images/book.png', cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (1200,800))
name = 'Trackbar'
cv2.namedWindow(name)
# block_size: 적응형 이진화의 블록 크기를 조정 (초기값 25, 최대값 100).
cv2.createTrackbar('block_size', name, 25, 100, empty) # 블록 크기는 홀수여야 하고, 1보다 커야 함.
# c: 이진화에서 가중 평균에서 빼는 값 (초기값 3, 최대값 10).
# 일반적으로 양수를 사용하며, 이 값을 키우면 결과가 더 어둡게 나타날 수 있음.
cv2.createTrackbar('c', name, 3, 10, empty)
while True:
block_size = cv2.getTrackbarPos('block_size', name) # bar 이름, 창의 이름
c = cv2.getTrackbarPos('c', name) # bar 이름, 창의 이름
# block_size 값 검증 및 보정:
# 적응형 이진화에서 block_size는 홀수이고, 1보다 커야 함.
# 값이 1 이하라면 기본값으로 3을 사용 (음수 변형).
if block_size <= 1:
block_size = 3
# 값이 짝수라면 홀수로 변환(block_size += 1).
if block_size % 2 == 0:
block_size += 1
# 적응형 이진화 적용
# img: 입력 이미지.
# 255: 최대값(흰색).
# cv2.ADAPTIVE_THRESH_MEAN_C: 블록 평균값을 기준으로 이진화.
# cv2.THRESH_BINARY: 결과를 흰색(255) 또는 검정(0)으로 만듦.
# block_size: 이진화를 계산할 영역의 크기 (홀수).
# c: 블록 평균값에서 뺄 상수.
binary = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, block_size, c)
cv2.imshow(name, binary)
if cv2.waitKey(1) == ord('q'):
break
cv2.destroyAllWindows()
show_video_as_html('../Media/videos/13_2.mp4')
'Video'
오츠 알고리즘¶
- 자동 임계값 결정:
오츠 알고리즘은 이미지 히스토그램의 픽셀 값 분포를 기반으로 배경과 전경을 분리하는 데 가장 적합한 임계값을 찾습니다.
- 두 번째 인자 무시:
cv2.THRESH_OTSU를 사용하면 두 번째 인자(사용자 정의 임계값)는 무시됩니다.
In [3]:
import cv2
import numpy as np
img = cv2.imread('../Media/images/book.png', cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (680,480))
ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret, otsu = cv2.threshold(img, -1, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 두번쨰 인자 값 무시됨 오츠 알고리즘
print(ret) # 오츠알고리즘 최적 값
cv2.imshow('img',img)
cv2.imshow('binary',binary)
cv2.imshow('otsu',otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()
show_image_with_pil(cv2.resize(img, None, fx = 0.5, fy = 0.5), 'img')
show_image_with_pil(cv2.resize(binary, None, fx = 0.5, fy = 0.5), 'binary')
show_image_with_pil(cv2.resize(otsu, None, fx = 0.5, fy = 0.5), 'otsu')
122.0 'img'
'binary'
'otsu'
'Python > OpenCV' 카테고리의 다른 글
15. 이미지 변환(열림 & 닫힘) (0) | 2024.11.19 |
---|---|
14. 이미지 변환(팽창) (0) | 2024.11.18 |
13_1. 이미지 변형(이진화) (0) | 2024.11.18 |
12. 이미지 변형(원근) (0) | 2024.11.18 |
11. 이미지 변형(흐림) (0) | 2024.11.18 |