반응형

아래 처럼 단순 별모양 이미지에서 외곽선, 최 내부의 꼭지점, 최 외곽의 블록성(Convexity)를 탐지 한다.

 

외곽선(Contour) 탐지

블록성 결함. (Convexity Defects) : Contour 라인에서 블록체가 되지 못하게 오목하게 들어간 부분 탐지

 

코드 사용을 위해서는 opencv, numpy 라이브러리를 설치해야 한다.

또한 위와같이 'star.jpg' 또는 아무 이미지를 사용해야 한다.

테스트한 이미지는 흑백의 구분이 편한 이미지를 사용했다.

다른 색상 있는 일반이미지는 threshold를 통해 흑백으로 원하는 부분을 추출해서 사용해야 잘 먹힌다.

반응형
import cv2
import numpy as np

img = cv2.imread('star.jpg')                                # 이미지 불러오기
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)              # 이미지 그레이 전환

ret, thresh = cv2.threshold(imgray, 120, 255, 0)                                         # 흑과 백으로 임계(threshold) 분할
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)   # contour(외곽선)를 찾아냄.(연속된 좌표점)

cv2.drawContours(img, contours, -1, (0, 255, 0), 2)     # contour(외곽선)을 그림, 초록색(0 255 0), 두께 2로
cnt = contours[0]                                       # cnt변수에 Contour[0]에 있는 2차원 연속된 좌표를 넣음.

# 윤곽(convex)정보 휙득
hull = cv2.convexHull(cnt, returnPoints=False)

defects = cv2.convexityDefects(cnt, hull)   #

for i in range(defects.shape[0]):

    s, e, f, d = defects[i, 0]
    start = tuple(cnt[s][0])
    end = tuple(cnt[e][0])
    far = tuple(cnt[f][0])

    # 바깥 최 외곽선을 이은 line 표시 (파랑색)
    cv2.line(img, start, end, [255, 0, 0], 2)

    # 내부의 꼭지점에 좌표점 표시 (빨간색)
    cv2.circle(img, far, 5, [0, 0, 255], -1)


cv2.imshow('img', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

이미지 확대 축소 관련

https://ansan-survivor.tistory.com/641

 

[Python OpenCV] 파이썬 이미지 회전하기, 확대 축소 하기

'mask.jpg' 라는 이미지를 파일로 만들어 사용했다. 파이썬 돌리는 코드와 동일한 디렉터리에 해당 파일이 있어야 한다. 이미지를 회전시키기. 이미지의 scale 조절하기 두 기능을 합쳐서 움직이기

ansan-survivor.tistory.com

 

 

 

반응형

+ Recent posts