# ※ 일반적으로 그레이스케일화된 이미지로 수행한다
# 물체의 색보다 형체를 알아볼 때 사용
# 엣지 디텍션은 항상 그레이스케일화를 먼저 해야 한다
sobel = cv2.Sobel(gray_img, cv2.CV_8U, 1, 0, 3)
laplacian = cv2.Laplacian(gray_img, cv2.CV_8U, ksize = 3)
canny = cv2.Canny(gray_img, 100, 255)
# 이미지 시각화
plt.figure(figsize = (10, 10))
# 원본 이미지
plt.subplot(2,2,1)
plt.imshow(img_rgb)
plt.title('Original')
plt.axis('off')
# 소벨
plt.subplot(2,2,2)
plt.imshow(sobel)
plt.title('Sobel')
plt.axis('off')
# 라플라시안
plt.subplot(2,2,3)
plt.imshow(laplacian)
plt.title('Laplacian')
plt.axis('off')
# 캐니
plt.subplot(2,2,4)
plt.imshow(canny)
plt.title('Canny')
plt.axis('off')
# 이미지 표시
plt.show()
text = cv2.imread('짱구는 못말려 텍스트.jpg')
# 그레이스케일화 필요
text = cv2.cvtColor(text, cv2.COLOR_RGB2GRAY)
ret, binary = cv2.threshold(text, 100, 255, cv2.THRESH_BINARY)
# ret는 수동으로 100을 줘버려서 안 쓰는 값, binary만 쓴다고 생각하면 된다
plt.imshow(binary, cmap = 'gray')
# 윤곽선 검출을 위해서는 반드시 이진화 후 진행해야 함
# 색 반전
binary = cv2.bitwise_not(binary) # 흰 ↔ 검
# 최외곽 윤곽선 검출
# 윤곽선 검출 시에는 binary를 넣어준다
contours, hierarchy = cv2.findContours(binary, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)
# binary를 넣어줘도 되는데 윤곽선과 번호 잘 보이도록 흰 배경을 다시 넣어주자
# text가 원래 1차원이었기 때문에 빨간색 윤곽선이 나오지 않는 이슈 발생
# 3차원으로 바꿔준다
text_3 = cv2.cvtColor(text, cv2.COLOR_GRAY2RGB)
# text_3.shape → (648, 1152, 3)
# 차례로 윤곽선과 번호 그리기
for i in range(len(contours)):
# 윤곽선 그리기
cv2.drawContours(text_3, [contours[i]], 0, (0,0,255), 1)
cv2.putText(text_3, str(i), tuple(contours[i][0][0]), cv2.FONT_HERSHEY_COMPLEX, 0.8, (40,40,112), 1)
# 시각화
plt.figure(figsize=(10,10))
plt.imshow(cv2.cvtColor(text_3, cv2.COLOR_BGR2RGB))
plt.show()
[같은 계층에서의 다음 윤곽선, 같은 계층에서의 이전 윤곽선, 하위 계층(내측) 윤곽선, 상위 계층(외측) 윤곽선]
정수 : 해당 윤곽선 번호, -1 : 존재하지 않음
![]() | ![]() |
---|