안녕하세요, 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 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.]
'파이썬 (Python) > 딥러닝 (Deep Learning)' 카테고리의 다른 글
Python 딥러닝 선형 회귀 최소 제곱법 구현 해보기 (0) | 2021.06.04 |
---|---|
Python opencv 이용하여 채널 분리 및 병합하는 방법 (0) | 2021.03.17 |
Python opencv 이용하여 이미지 채널 범위 병합하는 방법 (0) | 2021.03.05 |
Python opencv 이용하여 이미지 Hue, Saturation, Value 값 구현 심화학습 (0) | 2021.03.05 |
Python opencv 이용하여 이미지 Hue, Saturation, Value 값 구현하는 방법 (0) | 2021.03.05 |
댓글