참고 글
13. 이진화(binarization)
이진화는 특정값을 기준으로 흰색과 검은색으로만 나누는 것이다.즉 흰색과 검은색만 가지는 바이너리(Binary) 이미지로 변형하는 과정을 이진화라고 한다.
먼저 이진화를 위해 이미지를 GRAYSCALE로 읽어온다.
import cv2
img = cv2.imread("book.jpg", cv2.IMREAD_GRAYSCALE)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
이제 이 흑백 이미지를 이용해 이진화를 진행한다. 이진화를 할 때는 cv2.threshold 함수를 사용한다.
여기서 Threshold는 임계값, 즉 기준 값으로 주어진 상황에 따라 기준이 달라진다. 따라서 cv2.threshold 함수는 특정 값을 기준으로 흑 또는 백으로 나타낼 수 있다.
cv2.threshold(src, thresh, maxval, type)
cv2.threshold 함수에서 thresh는 임계값을 의미하며 maxval은 임계값을 넘었을 때 적용할 value를 지정한다. type의 경우 thresholding type으로 아래와 같은 type이 있으며 각각의 결과는 다음과 같다.
- cv2.THRESH_BINARY
- cv2.THRESH_BINARY_INV
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2.THRESH_TOZERO_INV
여기서 cv2.THRESH_BINARY를 이용해 이미지를 이진화하면 다음과 같다.
import cv2
img = cv2.imread("book.jpg", cv2.IMREAD_GRAYSCALE)
# cv2.threshold(src, thresh, maxval, type)
ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("image", img)
cv2.imshow("binarization", binary)
cv2.waitKey(0)
cv2.destroyAllWindows()
여기서 임계값은 임의로 255의 절반인 127로 지정했다. 또한 thresholding type이 cv2.THRESHOLD_BINARY이기 때문에 만약 127보다 값이 큰 경우엔 255(white)으로 처리하며, 127보다 작은 경우 0(black)으로 처리한다.
Trackbar
이진화 한 이미지에 trackbar를 추가하여 값의 변화에 따라 변형을 확인할 수 있다. trackbar를 추가하기 위해서는 cv2.createTrackbar 함수를 사용한다.
cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
cv2.createTrackbar 함수에는 trackbar 이름(trackName)과 window이름(windowName), 그리고 trackbar의 초기값을 value에 지정하고, 이 값의 max값을 count에 지정한다. min값은 항상 0이기 때문에 따로 지정하지 않는다.
onChange는 slide값을 바뀔 때마다 처리하는 이벤트에 대한 callback함수이다. 여기서 전달되는 paramter는 trackbar Postion이다.
trackbar를 만들고 나면 cv2.getTrackbarPos 함수를 이용해 trackbar Postion 값을 받아온다.
cv2.getTrackbarPos(trackbarName, windowName)
cv2.getTrackbarPos 함수에는 사용할 trackbar의 이름(trackbarName)과 해당 trackbar가 있는 window의 이름(windowName)을 가져온다. 이처럼 trackbar를 추가하기 위해서는 먼저 window를 추가해야한다.
trackbar를 추가하여 값의 변화에 따른 변형을 확인하기 위해 다음과 같이 코드를 작성한다.
# onChange는 특별한 처리가 없는 함수 empty를 정의하여 사용
import cv2
def empty(pos):
pass
img = cv2.imread("book.jpg", cv2.IMREAD_GRAYSCALE)
# Trackbar를 사용하기 위한 Windowname 설정
name = "Trackbar"
cv2.namedWindow(name)
# cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
cv2.createTrackbar("threshold", name, 127, 255, empty)
# 이미지의 변화를 확인하기 위해 동영상 출력과 같이 반복문을 사용한다
while True:
thresh = cv2.getTrackbarPos("threshold", name)
ret, binary = cv2.threshold(img, thresh, 255, cv2.THRESH_BINARY)
# 성공 여부 확인
if not ret:
break
# "q"키로 종료
cv2.imshow(name, binary)
if cv2.waitKey(1) == ord("q"):
break
cv2.destroyAllWindows()
이 처럼 상단의 trackbar를 움직여 값을 조정하여 이미지를 변형할 수 있다.
'Study > ML | DL' 카테고리의 다른 글
[Python] OpenCV를 이용한 이미지/영상 처리 - 모폴로지 변환(dilate, erode) (1) | 2023.06.13 |
---|---|
[Python] OpenCV를 이용한 이미지/영상 처리 - Adaptive Threshold, otsu algorithm Threshold (0) | 2023.06.08 |
[Python] OpenCV를 이용한 반 자동 문서스캐너 구현하기2 - 반 자동 문서 스캐너 구현 (0) | 2023.06.01 |
[Python] OpenCV를 이용한 반 자동 문서스캐너 구현하기1 - Mouse event (0) | 2023.05.25 |
[Python] OpenCV를 이용한 이미지/영상 처리 - 이미지 변형(흑백, 흐림, 원근) (1) | 2023.05.24 |