[Python] opencv - 이진화

개발log·2024년 3월 7일
0

Python

목록 보기
14/17
post-thumbnail

이진화

  • 임계값 이하의 픽셀은 검은색(0)으로, 임계값 이상의 픽셀은 흰색(255)으로 표시
  • 이미지를 흑백 이미지로 변환하거나 특정 객체를 강조하는데 사용
import cv2
img = cv2.imread('../OpenCV/book.jpg', cv2.IMREAD_GRAYSCALE)
                                #임계값 #변환값
ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

cv2.imshow('img',img)
cv2.imshow('binary', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

Trackbar

  • 사용자 인터페이스에서 숫자 값을 조절할 수 있는 GUI 요소
  • 사용자가 값을 조절할 때마다 콜백 함수를 호출하여 해당 값을 실시간으로 반영
import cv2
def empty(pos):
    print(pos)
    pass

img = cv2.imread('../OpenCV/book.jpg', cv2.IMREAD_GRAYSCALE)
name = 'TrackBar'
cv2.namedWindow(name)
# bar 이름, 창의 이름, 초기값, 최대값, 이벤트 처리
cv2.createTrackbar('threshold', name, 127, 255, empty)

while True:
    thresh = cv2.getTrackbarPos('threshold', name) # bar 이름, 창의 이름
    ret, binary = cv2.threshold(img, thresh,255, cv2.THRESH_BINARY)

    if not ret:
        break
    cv2.imshow(name, binary)
    if cv2.waitKey(1)==ord('q'):
        break

cv2.destroyAllWindows()

기준에 따라 색 변화

import cv2
img = cv2.imread('../OpenCV/book.jpg', cv2.IMREAD_GRAYSCALE)
# 진한 회색, 밝은 회색, 흰색
ret, binary1 = cv2.threshold(img, 0,255, cv2.THRESH_BINARY)
# 밝은 회색, 흰색
ret, binary2 = cv2.threshold(img, 127,255, cv2.THRESH_BINARY) 
# 흰색
ret, binary3 = cv2.threshold(img, 195,255, cv2.THRESH_BINARY)

cv2.imshow('img',img)
cv2.imshow('binary1', binary1)
cv2.imshow('binary2', binary2)
cv2.imshow('binary3', binary3)
cv2.waitKey(0)
cv2.destroyAllWindows()

Adaptive Threshold

  • 이미지를 작은 영역으로 나누어서 임계치 적용
import cv2
def empty(pos):
    print(pos)
    pass

img = cv2.imread('../OpenCV/book.jpg', cv2.IMREAD_GRAYSCALE)
name = 'TrackBar'
cv2.namedWindow(name)
# bar 이름, 창의 이름, 초기값, 최대값, 이벤트 처리
cv2.createTrackbar('block_size', name, 25, 100, empty)# 홀수만 가능, 1보다 큰 값
cv2.createTrackbar('c', name, 3, 10, empty)# 일반적으로 양수의 값을 사용

while True:
    block_size = cv2.getTrackbarPos('block_size', name) # bar 이름, 창의 이름
    c = cv2.getTrackbarPos('c', name)

    if block_size <=1: # 1이하면 3으로
        block_size = 3

    if block_size % 2 ==0: # 짝수면 홀수로
        block_size+=1

    binary = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, block_size, c)

    cv2.imshow('img', img)
    cv2.imshow(name, binary)
    if cv2.waitKey(1)==ord('q'):
        break

cv2.destroyAllWindows()

오츠 알고리즘

  • Bimoadl Image에 사용하기 적합(최적의 임계치를 자동으로 발견)
import cv2
img = cv2.imread('../OpenCV/book.jpg', cv2.IMREAD_GRAYSCALE)

ret, binary = cv2.threshold(img, 127,255, cv2.THRESH_BINARY) # 진한 회색, 밝은 회색, 흰색
ret, otsu = cv2.threshold(img, -1,255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 밝은 회색, 흰색
print('otsu threshold', ret)
cv2.imshow('img',img)
cv2.imshow('binary', binary)
cv2.imshow('otsu', otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()

profile
나의 개발 저장소

0개의 댓글