이미지 경계선 얻기 - cv2.threshold()
우선 피포페인팅 도안을 생성하기 위해 도안이 될 이미지에서 선을 따는 작업이 필요했는데, 이를 도와줄 함수로
cv2.threshold() 함수가 적절해 보여서, 사용하기로 했다. 비슷한 기능을 할 만한 함수로 cv2.canny() 함수가 있었는데, 다음 장에서 차이
threshold는 구글 번역기에서는 한계점 이라고 해석되는데, 구글링을 통해 관련 문서를 보면 임계점(사실 같은뜻이지만?) 이라고 많이 부르는 것 같다.
임계점이라는 의미를 알았으니, OpenCV doc에서 cv2.threshold() 함수의 설명과 파라미터에 대해 알아보자.
문서의 내용을 간단히 요약하면,
"픽셀 값이 임계값보다 작으면 0으로 설정되고, 그렇지 않으면 최대값으로 설정됩니다."
이 부분이 메인이라고 볼 수 있을 것 같다.
파라미터를 살펴보자.
cv2.threshold(src, thresh, maxval, type)
return value : retval, dst
parameter
src - 첫 번째 인수는 회색조 이미지여야 하는 소스 이미지 입니다.
thresh - 두 번째 인수는 픽셀 값을 분류하는 데 사용되는 임계값입니다.
maxval - 세 번째 인수는 임계값을 초과하는 픽셀 값에 할당되는 최대값입니다.
type - OpenCV는 함수의 네 번째 매개변수에 의해 제공되는 다양한 유형의 임계값을 제공합니다. 위에서 설명한 기본 임계값은 cv.THRESH_BINARY 유형을 사용하여 수행됩니다 .
return value
retval - 첫 번째는 사용된 임계값이고
dst - 두 번째 출력은 임계값 이미지 입니다
OpenCV 문서에 아주 상세하게 설명되어 있다.
네번째 파라미터인 type을 변경해가면서 테스트를 해볼텐데, 나는 백예린님의 팬이므로 백예린님 사진을 통해 type을 변경해가면서 비교해보자.
코드의 출처는 OpenCV docs 문서이며, 이미지의 경로만 변경했다.
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('D:\yerin.jpg',0)
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
ret,thresh2 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV)
ret,thresh3 = cv.threshold(img,127,255,cv.THRESH_TRUNC)
ret,thresh4 = cv.threshold(img,127,255,cv.THRESH_TOZERO)
ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray',vmin=0,vmax=255)
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
내가 원하는 피포페인팅의 도안을 위해서는 BINARY type을 사용하는게 맞아보인다.
사실 지금 사용하고 있는 경계선을 얻어내는 방식은 cv2.canny()함수를 사용하고 있는데 프로토타입이 완성되면
품질 향상을 위해 threshold 함수도 고려해볼 수 있어보인다.
이상으로 오늘의 포스팅은 끗 ㅎㅅㅎ
Reference
https://docs.opencv.org/4.5.2/d7/d4d/tutorial_py_thresholding.html
https://opencv-python.readthedocs.io/en/latest/doc/09.imageThresholding/imageThresholding.html
'TIL' 카테고리의 다른 글
2021.09.09 (0) | 2021.09.10 |
---|---|
2021.09.08 (0) | 2021.09.08 |
[TIL] python OpenCV - 1 (1) | 2021.07.26 |
외부에서 내 컴퓨터 접속하기 (apache, 포트포워딩) (1) | 2021.03.29 |
C언어에서 배열의 크기를 변수로 선언할 수 있을까? (5) | 2019.10.29 |