Python OpenCV 이미지의 사물 윤곽선 작성

공유하기

  • Add this entry to Hatena Bookmark
  • 0

Python의 OpenCV 함수를 사용해 다음 이미지를 읽어서 동전의 윤곽을 작성/표시하는 방법을 소개합니다.

이미지를 다운로드 해서 ./image/S__26132483.png 이름으로 저장합니다.

전체 실행 소스

전체 소스는 다음과 같습니다. 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 함수를 사용해 각각의 변환 된 이미지를 파일로 저장할 수 있습니다.