예제 영상 파일
예제 파일은 아무 이미지 파일로 사용하셔도 됩니다. 저는 귀여운 강아지 초코로 진행해볼 예정입니다.
파일을 다운받으셔서 같은 환경(실행하는 파이썬 디렉터리)에 저장을 시켜 둡니다.
(만약 다른 곳에 있다면 경로를 아셔야 합니다)
트랙 바 사용
이번에 알아볼 것은 트랙 바라는 일종의 스크롤 바입니다. 이 스크롤바는 슬라이더 형태를 갖고 있으며, 일정 범위 내의 값들의 수치를 변경할 수 있습니다.
이번 실습은, 그레이스케일 이미지에서 이진화 처리를 해주는 트랙 바를 만들어 보겠습니다. 이진화는 영상을 흑과 백으로 분류하여 나타 내주는 것입니다. 이 때, 어떤 기준으로 흑인지 백인지 나눠주는 경곗값이 필요한데, 우리는 이러한 경곗값을 임계값이라고 합니다. 즉 임계값보다 작으면 흑, 크면 백이라고 생각하시면 됩니다. 우리는 임계값을 조절해주는 트랙 바를 만들어서 이미지를 흑과 백으로 나누어 보는 트랙 바를 만들어 보겠습니다.
먼저 트랙바의 필요한 변수를 살펴보도록 하겠습니다.
- createTrackbar
트랙 바를 사용하기 위해서는 createTracbar로 windows창을 띄운 후에 설정을 해주셔야 합니다. 트랙 바 변수를 살펴보면...
cv2.createTrackbar(trackBarName, windowsName, 최솟값, 최댓값, 콜백 함수)
trackBarName 은, 트랙바 생성 시, 트랙 바의 이름을 지정
windowsName은 트랙바를 나타낼 윈도 창의 이름
최솟값은 트랙바 범위의 시작 값
최댓값은 트랙 바 범위의 마지막 값
콜백 함수는 트랙 바 바를 조절 시, 위치한 값을 전달해 주는 것 (특별한 이벤트를 처리하지 않더라도, 필수적으로 함수는 만들 것)
우리는 그레이 스케일 이미지에서 밝기만 바꿔주면서 이미지를 확인할 것이며, 다른 특별한 처리를 하지 않을 것이기 때문에 콜백 함수는 아무것도 작동을 안 하는 fake function을 다음과 같이 정의하도록 하겠습니다.
def call_back(x) :
pass
windowsName은 image라고 정의를 한 후에, 그레이 스케일이 적용된 초코 이미지를 설정해두겠습니다.
img = cv2.imread("choco.jpg", cv2.IMREAD_GRAYSCALE)
cv2.imshow('image', img)
그럼, 트랙 바 생성에 필요한 변수 설정은 다 되었습니다. (이미지 밝기 0~255이기 때문에 최솟값=0, 최댓값=255)
cv2.createTrackbar('threshold', 'image', 0, 255, call_back)
트랙 바가 생성 시, 초기 임계값을 몇에 둘 것인지를 세팅해줍니다. (예제 코드는, 중간값인 127로 설정)
cv2.setTrackbarPos('threshold', 'image', 127)
- threshold
threshold 함수는, 이진화 처리를 해주는 함수로써, 특정한 임계값을 기준으로 흑과 백으로 구분해줍니다.
그럼 threshold의 변수를 살펴보도록 하겠습니다.
cv2.threshold(image, thresh, maxval, type)
image는 우리가 이진화 처리할 이미지이고,
thresh는 흑과 백을 나눠줄 임계값이고,
maxval - 임계값을 넘었을 때, 어떻게 처리할 것인지..
type은 thresholding type입니다.(THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC, THRESH_TOZERO, THRESH_TOZERO_INV)
임계값을 정해줄 low라는 변수를 만들었습니다. getTrackbarPos는 트랙 바에서 우리가 스크롤로 설정한 값을 받아 오는 것입니다.
우리는 그레이 스케일 초코 이미지(img)를 image 변수에 넣고, 임계값을 초과하면 255로 되도록 지정을 해주었습니다. (255가 max값이기 때문). 그리고 타입은 이진 처리를 위해 THRESH_BINARY를 사용하였습니다. 임계값이 움직일 때마다 현재 이미지에 보이도록 imshow함수를 바로 불러줍니다.
low = cv2.getTrackbarPos('threshold', 'image')
cv2.threshold(img, low, 255, cv2.THRESH_BINARY)
cv2.imshow('image', img_binary)
우리는 1초에 한 번씩 waitKey값이 27 즉 esc를 눌렀는지 안 눌렀는지 체크를 해주는 구문을 만들어서 threshold 함수에 따른 이미지 변화를 보여주도록 세팅을 해두었습니다.
while True :
low = cv2.getTrackbarPos('threshold', 'image')
ret, img_binary = cv2.threshold(img, low, 255, cv2.THRESH_BINARY)
cv2.imshow('image', img_binary)
if cv2.waitKey(1) == 27 :
break
완성된 코드는 다음과 같습니다.
def call_back(pos) :
pass
img = cv2.imread("choco.jpg", cv2.IMREAD_GRAYSCALE)
cv2.imshow('image', img)
cv2.createTrackbar('threshold', 'image', 0, 255, call_back)
cv2.setTrackbarPos('threshold', 'image', 127)
while True :
low = cv2.getTrackbarPos('threshold', 'image')
ret, img_binary = cv2.threshold(img, low, 255, cv2.THRESH_BINARY)
cv2.imshow('image', img_binary)
if cv2.waitKey(1) == 27 :
break
'AI > OpenCV-실습' 카테고리의 다른 글
OpenCV - 영상(이미지) 다루기(9)_(이미지 변환 응용) (0) | 2020.09.03 |
---|---|
OpenCV - 영상(이미지) 다루기(8)_(이미지 변환) (0) | 2020.09.03 |
OpenCV - 영상(이미지) 다루기(6)_(마우스 함수) (1) | 2020.09.02 |
OpenCV - 영상(이미지) 다루기(5)_(그리기 함수) (0) | 2020.09.02 |
OpenCV - 영상(이미지) 다루기(4)_(matplotlib 사용) (0) | 2020.09.02 |