Python의 OpenCV 함수를 사용해 다음 이미지를 읽어서 동전의 윤곽을 작성/표시하는 방법을 소개합니다.
전체 실행 소스
전체 소스는 다음과 같습니다. watershed_algorithim.py 파일을 다운로드 해서 실행합니다.
소스 내용 설명
이미지 읽어오기
컬러 이미지를 읽어서 img_bgr 변수에 대입합니다.
img_bgr = cv2.imread('./image/S__26132483.png')
cv2.imshow로 읽어온 이미지를 다음과 같이 화면에 표시합니다. cv2.imshow의 첫 번째 인수(argument) “img_bgr”는 표시 화면의 타이틀을 의미합니다.
cv2.imshow("img_bgr", img_bgr)
다음 코드는 ESC를 누르거나 이미지 표시의 오른쪽 상단의 X버튼을 눌러서 다음 코드 실행으로 넘어갑니다.
keycode = cv2.waitKey(0)
# ESC key to exit
if keycode == 27:
cv2.destroyAllWindows()
이미지 색상 반전 시키기
cv2.bitwise_not를 사용하여 색상을 반전 시킵니다.
img_bitwise_not_bgr = cv2.bitwise_not(img_bgr)
cv2.imshow로 색상 반전된 이미지를 다음과 같이 화면에 표시합니다.
cv2.imshow("img_bitwise_not_bgr", img_bitwise_not_bgr)
이미지를 GrayScale로 변환하기
반전된 이미지를 흰색과 검정, 회색의 GrayScale화 합니다.
img_bitwise_not_bgr2gray = cv2.cvtColor(img_bitwise_not_bgr, cv2.COLOR_BGR2GRAY)
cv2.imshow로 GrayScale화된 이미지를 다음과 같이 화면에 표시합니다
cv2.imshow("img_bitwise_not_bgr2gray", img_bitwise_not_bgr2gray)
이미지를 흑백 2색으로 변환하기
GrayScale화 된 이미지를 흰색과 검은색만을 사용하는 단색(Monochrome)으로 변환합니다.
ret, img_binary = cv2.threshold(img_bitwise_not_bgr2gray, 150,255,cv2.THRESH_BINARY)
cv2.imshow로 Monochrome화 된 이미지를 다음과 같이 화면에 표시합니다
cv2.imshow("img_binary", img_binary)
흑백 경계에 윤곽선 그리기
findContours함수를 통해 흰색과 검은색의 경계를 찾아 윤곽선의 좌표를 작성합니다. 그리고 drawContours함수를 사용해 작성한 윤곽선을 원본 이미지에 덮어 그립니다.
drawContours 함수
- 1번째 인수(argument)값 img_bgr는 원본 이미지를 의미합니다.
- 4번째 인수(argument)값 (0, 255, 0)는 R,G,B를 의미합니다. 녹색( Green)값 255의 윤곽선을 그립니다.
- 5번째 인수(argument)값 2는 윤곽선의 굵기를 의미합니다. 값이 클수록 더 굵게 윤곽선을 그립니다.
contours, hierarchy = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
img_contour = cv2.drawContours(img_bgr, contours, -1, (0, 255, 0), 2)
원본 이미지에 윤곽선을 덮어쓴 이미지를 다음과 같이 화면에 표시합니다
cv2.imshow("img_contour", img_contour)
위의 소스에서는 작성하지 않았지만 cv2.imwrite 함수를 사용해 각각의 변환 된 이미지를 파일로 저장할 수 있습니다.