흰색과 검은색만 가지는 이미지로 변형시키는 것을 말한다.
import cv2
img = cv2.imread('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()
색 값이 127을 넘으면 흰색으로 처리한다.
import cv2
def empty(pos):
pass
img = cv2.imread('book.jpg', cv2.IMREAD_GRAYSCALE)
name = 'Trackbar'
cv2.namedWindow(name)
cv2.createTrackbar('threshold', name, 127, 255, empty) # (bar 이름, 윈도우 이름, 초기값, 최대값, 이벤트 처리)
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()
윈도우 상단의 바를 움직이면 그에 따라 thresh 값이 변경되어 값 변화에 따른 이미지의 변화를 실시간으로 확인할 수 있다.
임계점을 넘으면 흰색으로 처리하는 것이다. 예를 들어 127인 회색이 있다면 임계치가 126이면 검은색, 127이면 흰색으로 처리하는 것이다.
이미지를 작은 영역으로 나누어서 임계치를 적용한다.
import cv2
def empty(pos):
pass
img = cv2.imread('book.jpg', cv2.IMREAD_GRAYSCALE)
name = 'Trackbar'
cv2.namedWindow(name)
# (bar 이름, 윈도우 이름, 초기값, 최대값, 이벤트 처리)
cv2.createTrackbar('block_size', name, 25, 100, empty) # block size는 홀수만 가능, 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(name, binary)
if cv2.waitKey(1) == ord('q'):
break
cv2.destroyAllWindows()
adaptiveThreshold의 두 번째 인수인 255는 임계치를 넘었을 때 최대값으로 처리할 값을 말한다. 위에서는 임계치를 넘으면 흰색으로 처리하도록 된 것이다.
Bimodal Image에 사용하기 적합 (최적의 임계치를 자동으로 발견)
import cv2
img = cv2.imread('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)
cv2.imshow('img', img)
cv2.imshow('binary', binary)
cv2.imshow('otsu', otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()
book 이미지는 오츠 알고리즘을 사용하기에 적합하지 않은 이미지이기 때문에 좋은 결과는 나오지 않았다.
흰색 영역의 외곽 픽셀 주변에 흰색을 추가
import cv2
import numpy as np
kernel = np.ones((3, 3), dtype=np.uint8)
img = cv2.imread('dilate.png', cv2.IMREAD_GRAYSCALE)
dilate1 = cv2.dilate(img, kernel, iterations=1) # (이미지, 커널, 반복 횟수)
dilate2 = cv2.dilate(img, kernel, iterations=2)
dilate3 = cv2.dilate(img, kernel, iterations=3)
cv2.imshow('gray', img)
cv2.imshow('dilate1', dilate1)
cv2.imshow('dilate2', dilate2)
cv2.imshow('dilate3', dilate3)
cv2.waitKey(0)
cv2.destroyAllWindows()
흰색 영역의 외곽 픽셀을 검은색으로 변경
import cv2
import numpy as np
kernel = np.ones((3, 3), dtype=np.uint8)
img = cv2.imread('erode.png', cv2.IMREAD_GRAYSCALE)
erode1 = cv2.erode(img, kernel, iterations=1)
erode2 = cv2.erode(img, kernel, iterations=2)
erode3 = cv2.erode(img, kernel, iterations=3)
cv2.imshow('gray', img)
cv2.imshow('erode1', erode1)
cv2.imshow('erode2', erode2)
cv2.imshow('erode3', erode3)
cv2.waitKey(0)
cv2.destroyAllWindows()
dilate(erode(image))
import cv2
import numpy as np
kernel = np.ones((3, 3), dtype=np.uint8)
img = cv2.imread('erode.png', cv2.IMREAD_GRAYSCALE)
erode = cv2.erode(img, kernel, iterations=3)
dilate = cv2.dilate(erode, kernel, iterations=3)
cv2.imshow('img', img)
cv2.imshow('erode', erode)
cv2.imshow('dilate', dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
erode(dilate(image))
import cv2
import numpy as np
kernel = np.ones((3, 3), dtype=np.uint8)
img = cv2.imread('dilate.png', cv2.IMREAD_GRAYSCALE)
dilate = cv2.dilate(img, kernel, iterations=3)
erode = cv2.erode(dilate, kernel, iterations=3)
cv2.imshow('img', img)
cv2.imshow('dilate', dilate)
cv2.imshow('erode', erode)
cv2.waitKey(0)
cv2.destroyAllWindows()