본문 바로가기
파이썬 (Python)/딥러닝 (Deep Learning)

Python opencv 이용하여 이미지 가장자리 검출하는 방법

by ★√★ 2021. 3. 6.

안녕하세요, Davey입니다. 오늘 포스팅할 내용은 opencv로 원하는 이미지에 가장자리를 검출하는 방법에 대해서 설명 드리도록 하겠습니다. 총 3가지 방법인 Canny, Sobel, Laplacian 으로 나눠서 설명 드리도록 하겠습니다.

 

 

이미지-가장자리-썸네일
이미지-가장자리

 

opencv를 이용하여 가장 자리 검토 방법 1 - Canny

 가장자리 검토 후 출력하는 코드는 3개로 구성이 되어 있습니다. Canny, Sobel, Laplacian 이렇게 3개를 가지고 구현을 하려고 합니다. 각 각 하나씩 코드와 함께 설명 드리겠습니다. 처음으로 Canny에 대해서 먼저 설명 드리도록 하겠습니다. (이미지 불러오고 라이브러리 선언하는 것은 Canny 코드에만 적용하였습니다.)

 

#opencv 라이브러리 선언
import cv2

#원본 이미지 불러오기
test_image = cv2.imread("002.jpg", cv2.IMREAD_COLOR)

#그레이스테일로 변환
gray_tr01 = cv2.cvtColor(test_image, cv2.COLOR_BGR2GRAY)

# Canny 방법 - 원본 이미지 그대로 가장자리를 추출하는 방법
method_canny = cv2.Canny(test_image, 100, 255)

 

코드 분석

- cv2.Canny(불러올 원본 이미지, 임계값1, 임계값2, 커널 크기, L2그라디언트)

1) 임계값1 : 임계값1 이하에 포함된 가장자리는 가장자리에서 제외.

2) 임계값2 : 임계값2 이상에 포함된 가장자리는 가장자리로 간주함.

3) 커널 크기 : Sobel 마스크의 Aperture Size를 의미. 입력하지 않을 경우에는 자동으로 할당함.

4) L2그라디언트 :  L2방식의 사용 유/무를 설정함. 즉 입력하지 않을 경우에는, L1그라디언트 방식을 사용.

 

L2그라디언트 : 

L1그라디언트 : 

 

opencv를 이용하여 가장 자리 검토 방법 2 - Sobel

: 두 번째 방은 Sobel입니다. Canny와 다르게 Sobel은 그레이스케일로 변환한 이미지를 이용하여 가장자리를 검토 하는 방법입니다. 이 부분에 대한 코드 및 분석 내용은 아래와 같습니다.

 

# Sobel 방법 - 그레이스케일로 변환한 이미지 그대로 가장자리를 추출하는 방법
method_sobel = cv2.Sobel(gray_tr01, cv2.CV_8U, 1, 0, 3)

 

코드분석

- cv2.Sobel(그레이스케일 변환한 이미지, 정밀도, X 방향 미분, Y 방향 미분, 커널, 배율, 델타, 픽셀 외삽법)

 

1) 정밀도 : 결과 이미지의 이미지 정밀도를 의미. (정밀도에 따라 결과물이 달라질 수 있음)

 

2) X 방향 미분 : 이미지에서 X 방향으로 미분할 값을 설정.

3) Y 방향 미분 : 이미지에서 Y 방향으로 미분할 값을 설정.

: X 방향 미분 값과 Y 방향의 미분 값의 합이 1 이상이여야 하며 각각의 값은 0보다 커야합니다.)

 

4) 커널 : Sobel 커널의 크기를 설정 (1, 3, 5, 7의 값을 사용)

5) 배율 : 계산된 미분 값에 대한 배율값

6) 델타 : 계산전 미분 값에 대한 추가값

7) 픽셀 외삽법 : 효과를 줄때 마다 계속적으로 설명드리는 부분입니다. 이미지를 가장자리 처리할 경우, 영역 밖의 픽셀은 추정해서 값을 할당하는 것입니다. 이미지 밖의 픽셀을 외삽하는데 사용되는 테두리 모드임.

 

 

opencv를 이용하여 가장 자리 검토 방법 3 - Laplacian

: 마지막으로 Laplacian 방법으로 가장자리 검토 및 추철 하는 방법에 대해서 설명 드리겠습니다. Laplacian 방법도 Sobel과 마찬가지로, 그레이스케일로 변환한 이미지를 이용하여 가장자리를 검토 하는 방법입니다. 코드 분석도 같이 하도록 하겠습니다.

 

# Laplacian - 그레이스케일로 변환한 이미지 그대로 가장자리를 추출하는 방법
method_laplacian = cv2.Laplacian(gray_tr01, cv2.CV_8U, ksize=3)

 

코드분석

- cv2.Laplacian(그레이스케일 변환한 이미지, 정밀도, 커널, 배율, 델타, 픽셀 외삽법)

1) 정밀도 : 결과 이미지의 이미지 정밀도를 의미. (정밀도에 따라 결과물이 달라질 수 있음)

2) 커널 : 2차 미분 필터의 크기를 설정 (1, 3, 5, 7의 값을 사용) 

: 커널 값이 1 경우3x3 Aperture Size 사용합니다. (중심값 = -4)

 

3) 배율 : 계산된 미분 값에 대한 배율값임

4) 델타 : 계산전 미분 값에 대한 추가값임

7) 픽셀 외삽법 : 효과를 줄때 마다 계속적으로 설명드리는 부분입니다. 이미지를 가장자리 처리할 경우, 영역 밖의 픽셀은 추정해서 값을 할당하는 것입니다. 이미지 밖의 픽셀을 외삽하는데 사용되는 테두리 모드임.


전체 구현 코드 및 결과 이미지

: 위의 코드를 종합하여 가장자리 검토 및 출력한 이미지를 출력하도록 하겠습니다. 출력한 이미지도 같이 첨부하도록 하겠습니다. 원본 이미지도 비교를 위해 같이 출력하도록 하겠습니다. 

 

import cv2

#원본 이미지 불러오기
test_image = cv2.imread("002.jpg", cv2.IMREAD_COLOR)

#그레이스테일로 변환
gray_tr01 = cv2.cvtColor(test_image, cv2.COLOR_BGR2GRAY)

# Canny 방법 - 원본 이미지 그대로 가장자리를 추출하는 방법
method_canny = cv2.Canny(test_image, 100, 255)

# Sobel 방법 - 그레이스케일로 변환한 이미지 그대로 가장자리를 추출하는 방법
method_sobel = cv2.Sobel(gray_tr01, cv2.CV_8U, 1, 0, 3)

# Laplacian - 그레이스케일로 변환한 이미지 그대로 가장자리를 추출하는 방법
method_laplacian = cv2.Laplacian(gray_tr01, cv2.CV_8U, ksize=3)

#원본 이미지 출력
cv2.imshow("Original Image", test_image)

# Canny로 방법 으로 가장자리 추출한 이미지
cv2.imshow("method_canny", method_canny)

# Sobel로 방법 으로 가장자리 추출한 이미지
cv2.imshow("method_canny", method_sobel)

# Laplacian 방법 으로 가장자리 추출한 이미지
cv2.imshow("method_laplacian", method_laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

이미지-가장자리-출력
이미지-가장자리-출력

 

맺음말

: 이번 포스팅은 opencv 이용하여 이미지 가장자리 검출하는 방법 및 출력하는 것 까지 정리해보았습니다. 가장자리를 추출하는 게 이미지 인식할 때 어떻게 쓰일지는 더 공부를 해봐야 될 거 같습니다. 그럼 이만 마무리 하도록 하겠습니다. 감사합니다.

 

제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다.


[저작권이나권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다검토  수정  삭제 조치 하도록 하겠습니다그리고기재되는 내용은 개인적으로 습득한 내용이므로 오류가 발생할  있을 가능성이 있으므로기재된 내용은 참조용으로만 봐주시길 바랍니다게시물에오류가 있을때도, Comment 달아 주시면검증 결과를 통해수정하도록 하겠습니다.]

728x90

댓글


// 내부링크를 현재창으로 열기 // Open internal links in same tab