이미지 경계선 얻기 - 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

 

OpenCV: Image Thresholding

Goal In this tutorial, you will learn simple thresholding, adaptive thresholding and Otsu's thresholding. You will learn the functions cv.threshold and cv.adaptiveThreshold. Simple Thresholding Here, the matter is straight-forward. For every pixel, the sam

docs.opencv.org

https://opencv-python.readthedocs.io/en/latest/doc/09.imageThresholding/imageThresholding.html

 

이미지 임계처리 — gramman 0.1 documentation

기본 임계처리 이진화 처리는 간단하지만, 쉽지 않은 문제를 가지고 있다. 이진화란 영상을 흑/백으로 분류하여 처리하는 것을 말합니다. 이때 기준이 되는 임계값을 어떻게 결정할 것인지가 중

opencv-python.readthedocs.io

 

'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

+ Recent posts