이미지에서 색상이 바뀌는 부분을 경계선이라고 한다.
즉, 우리가 그림을 그릴때, 스케치를 먼저 하고 그 안을 색상으로 채우게 되는데 그때 하는 스케치가 경계선을 그리는 작업이다.

경계선을 검출하기 위해 가장 많이 사용되는건 cv2.Canny() 함수이다.

cv2.Canny()함수는 총 3개의 인수를 전달받아 사용하는데, 첫번째는 대상 이미지, 두번째는 하위 임계값, 세번째는 상위 임계값이다.
색 변화가 하위 임계값보다 낮은경우에는 외곽선으로 인식하지 않으면, 상위 임계값보다 큰 경우에만 외곽선으로 인식하여 이미지를 검출하게 된다.

검출된 이미지를 살펴보면, 원본 이미지의 눈사람 아래 눈은 외곽선으로 그려지지 않았다. 즉 설정한 하위 임계값 보다 낮은 색변화인 것이다.
이제 트렉바를 추가하여 임계값 변화에 따른 외곽선이 어떻게 검출 되는지 확인해보자.

둘다 0,0 일때에는 배경의 그라데이션 부분까지 모두 외곽선이 검출되었다.

0,53 일때 왼쪽 아래 있는 눈쌓인 돌까지 외곽선이 검출 되었다.

255,255 (둘다 최대값)인 경우 정확하게 다른 색상으로 변환 부분의 외곽선만 검출 되었다.

전체 코드는 기존 트랙바를 추가하던 방법이랑 동일하다.
윤곽선은 경계선을 연결한 선이다.
윤곽선을 검출하는 작업은 조금 복잡하다.

윤곽선은 cv2.findContours()를 통해 검출하고 cv2.drawContours()를 통해 그리게 된다.
이때 cv2.drawContours()함수는 원본 이미지 바로 위에 외곽선을 그려주기 때문에, 원본 보호를 위해 사본을 사용하는것이 좋다.
이때 cv2.CHAIN_APPROX_NONE은 윤곽선을 찾을 때 사용하는 근사치 방법중 하나이며, 몇 종류가 더 있지만 크게 NONE과 SIMPLE 두가지를 사용한다. NONE은 모든 윤곽선 정보를 반환하지만, SIMPLE로 설정하면 윤곽선을 꼭지점(예를 들어 윤곽선이 정 사각형으로 검출되었으면, 각 꼭지점 4개의 정보만 반환한다)만 반환한다.

윤곽선 검출을 위해 총 3단계의 작업을 거쳤다.
먼저 cv2.cvtColor() 함수를 통해 불러온 이미지를 grayscale 로 변환하였고
otsu를 통해 이진화를 진행 하였다.
마지막으로 cv2.findContours()함수를 이용해 윤곽선을 검출한 다음, 사본 이미지에 그려주었다.
이러한 윤곽선을 찾는 모드는 3가지 정보가 있는데

위에서 사용한 cv2.RETR_LIST 제외하고, 나머지 두 모드에 대해 코드로 확인해보자.

먼저 cv2.RETR_EXTERNAL 모드를 적용해 보았다.

검출된 외곽선을 확인해보면, 안쪽 무늬와 'A'에는 외곽선이 검출되지 않았고, 카드 4장의 외곽선만 검출 되었다.
즉 외곽선 안쪽 영역에서는 외곽선을 검출하지 못한다.

cv2.RETR_TREE 모드의 경우 기존에 사용한 cv2.RETR_LIST와 동일하게 윤곽선을 그려준다
다만 이때에는 계층정보를 전달하는데, 이전 윤곽선, 부모 윤곽선, 다음 윤곽선 등의 계층 구조를 hierarchy 변수에 저장하게 된다.
이렇게 검출한 윤곽선 정보를 가지고 재미있는 몇가지 작업을 할 수 있다.
먼저 사각형 그리기다.

cv2.boudingRect()함수를 사용하면 해당 지점의 x,y 좌표값과 너비와 높이(크기) 정보를 얻어올 수 있다.
contours에 저장한 외곽선 정보를 for문을 통해 반복해 주고, cv2.boundingRect()를 이용하여 해당 값들을 추출해준다.
이제 cv2.rectangle()을 이용하여 사각형을 그려주면 된다.

윤곽선이 이제 이미지를 따라서 그려지지 않고 정사각형 형태로 표시되었다.
이렇게 그려진 윤곽선은 크기(면적)을 가지는데, if문을 활용하면 일정 크기 이상 또는 이하의 윤곽선만 그리는것도 가능하다.

윤곽선이 그려진 면적을 구하는건 cv2.contourArea()함수를 이용한다.

그려놓고 보니 cv2.RETR_EXTERNAL 모드와 결과가 같아졌다.
응용 방법은 무궁무진 하니, 이런 방법이 있다는 것 정도만 기억해두자.
'개인공부 > python' 카테고리의 다른 글
| 나 혼자 하는 프로젝트 5탄 - OpenCV - 12. 퀴즈 (0) | 2022.11.26 |
|---|---|
| 나 혼자 하는 프로젝트 5탄 - OpenCV - 11. 미니 프로젝트2( 이미지 추출 후 저장) (0) | 2022.11.25 |
| 나 혼자 하는 프로젝트 5탄 - OpenCV - 9. 이미지 변형(팽창, 침식) (0) | 2022.11.25 |
| 나 혼자 하는 프로젝트 5탄 - OpenCV - 8. 이미지 변형(이진화) (0) | 2022.11.24 |
| 나 혼자 하는 프로젝트 5탄 - OpenCV - 7. 미니 프로젝트(반자동 문서 스캐너) (1) | 2022.11.24 |