Python OpenCV 강좌 : 제 14강 - 가장자리 검출

Python OpenCV Edge Image

Python OpenCV 강좌 : 제 14강 - 가장자리 검출
[ Python-OpenCV ] - 윤대희

가장자리 검출(Edge)


1 가장자리(Edge)는 가장 바깥 부분의 둘레를 의미하며, 객체의 테두리로 볼 수 있습니다.

이미지 상에서 가장자리는 전경(Foreground)배경(Background)이 구분되는 지점이며, 전경과 배경 사이에서 밝기가 큰 폭으로 변하는 지점이 객체의 가장자리가 됩니다.

그러므로 가장자리는 픽셀의 밝기가 급격하게 변하는 부분으로 간주할 수 있습니다.

가장자리를 찾기 위해 미분(Derivative)기울기(Gradient) 연산을 수행하며, 이미지 상에서 픽셀의 밝기 변화율이 높은 경계선을 찾습니다.



Main Code


import cv2

src = cv2.imread("Image/wheat.jpg", cv2.IMREAD_COLOR)
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, 3)
laplacian = cv2.Laplacian(gray, cv2.CV_8U, ksize=3)
canny = cv2.Canny(src, 100, 255)

cv2.imshow("sobel", sobel)
cv2.imshow("laplacian", laplacian)
cv2.imshow("canny", canny)
cv2.waitKey()
cv2.destroyAllWindows()



Sobel Detailed Code


sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, 3)

소벨 함수(cv2.Sobel)로 입력 이미지에서 가장자리를 검출할 수 있습니다.

미분 값을 구할 때 가장 많이 사용되는 연산자이며, 인접한 픽셀들의 차이로 기울기(Gradient)의 크기를 구합니다.

이때 인접한 픽셀들의 기울기를 계산하기 위해 컨벌루션 연산을 수행합니다.

dst = cv2.Sobel(src, ddepth, dx, dy, ksize, scale, delta, borderType)입력 이미지(src)출력 이미지 정밀도(ddepth)를 설정하고 dx(X 방향 미분 차수), dy(Y 방향 미분 차수), 커널 크기(ksize), 비율(scale), 오프셋(delta), 테두리 외삽법(borderType)을 설정하여 결과 이미지(dst)를 반환합니다.

출력 이미지 정밀도는 반환되는 결과 이미지의 정밀도를 설정합니다.

X 방향 미분 차수는 이미지에서 X 방향으로 미분할 차수를 설정합니다.

Y 방향 미분 차수는 이미지에서 Y 방향으로 미분할 차수를 설정합니다.

커널 크기는 소벨 마스크의 크기를 설정합니다. 1, 3, 5, 7 등의 홀수 값을 사용하며, 최대 31까지 설정할 수 있습니다.

비율오프셋은 출력 이미지를 반환하기 전에 적용되며, 주로 시각적으로 확인하기 위해 사용합니다.

픽셀 외삽법은 이미지 가장자리 부분의 처리 방식을 설정합니다.


  • Tip : X 방향 미분 차수Y 방향 미분 차수는 합이 1 이상이여야 하며, 0의 값은 해당 방향으로 미분하지 않음을 의미합니다.



Laplacian Detailed Code


laplacian = cv2.Laplacian(gray, cv2.CV_8U, ksize=3)

라플라시안 함수(cv2.Laplacian)로 입력 이미지에서 가장자리를 검출할 수 있습니다.

라플라시안은 2차 미분의 형태로 가장자리가 밝은 부분에서 발생한 것인지, 어두운 부분에서 발생한 것인지 알 수 있습니다.

2차 미분 방식은 X 축과 Y 축을 따라 2차 미분한 합을 의미합니다.

dst = cv2.laplacian(src, ddepth, ksize, scale, delta, borderType)입력 이미지(src)출력 이미지 정밀도(ddepth)를 설정하고 커널 크기(ksize), 비율(scale), 오프셋(delta), 테두리 외삽법(borderType)을 설정하여 결과 이미지(dst)를 반환합니다.

출력 이미지 정밀도는 반환되는 결과 이미지의 정밀도를 설정합니다.

커널 크기는 라플라시안 필터의 크기를 설정합니다. 커널의 값이 1일 경우, 중심값이 -4인 3 x 3 Aperture Size를 사용합니다.

비율오프셋은 출력 이미지를 반환하기 전에 적용되며, 주로 시각적으로 확인하기 위해 사용합니다.

픽셀 외삽법은 이미지 가장자리 부분의 처리 방식을 설정합니다.



Canny Detailed Code


canny = cv2.Canny(src, 100, 255)

캐니 함수(cv2.Canny)로 입력 이미지에서 가장자리를 검출할 수 있습니다.

캐니 엣지는 라플라스 필터 방식을 개선한 방식으로 x와 y에 대해 1차 미분을 계산한 다음, 네 방향으로 미분합니다.

네 방향으로 미분한 결과로 극댓값을 갖는 지점들이 가장자리가 됩니다.

앞서 설명한 가장자리 검출기보다 성능이 월등히 좋으며 노이즈에 민감하지 않아 강한 가장자리를 검출하는 데 목적을 둔 알고리즘입니다.

dst = cv2.Canny(src, threshold1, threshold2, apertureSize, L2gradient)입력 이미지(src)하위 임곗값(threshold1), 상위 임곗값(threshold2), 소벨 연산자 마스크 크기(apertureSize), L2 그레이디언트(L2gradient)을 설정하여 결과 이미지(dst)를 반환합니다.

하위 임곗값상위 임곗값으로 픽셀이 갖는 최솟값과 최댓값을 설정해 검출을 진행합니다.

픽셀이 상위 임곗값보다 큰 기울기를 가지면 픽셀을 가장자리로 간주하고, 하위 임곗값보다 낮은 경우 가장자리로 고려하지 않습니다.

소벨 연산자 마스크 크기는 소벨 연산을 활용하므로, 소벨 마스크의 크기를 설정합니다.

L2 그레이디언트는 L2-norm으로 방향성 그레이디언트를 정확하게 계산할지, 정확성은 떨어지지만 속도가 더 빠른 L1-norm으로 계산할지를 선택합니다.


L1그라디언트 : $$ L_{1} = \left \frac{dI}{dx} \right + \left \frac{dI}{dy} \right $$

L2그라디언트 : \(\sqrt{(dI/dx)^2 + (dI/dy)^2}\)



Additional Information


픽셀 외삽법 종류

속성 의미
cv2.BORDER_CONSTANT iiiiii | abcdefgh | iiiiiii
cv2.BORDER_REPLICATE aaaaaa | abcdefgh | hhhhhhh
cv2.BORDER_REFLECT fedcba | abcdefgh | hgfedcb
cv2.BORDER_WRAP cdefgh | abcdefgh | abcdefg
cv2.BORDER_REFLECT_101 gfedcb | abcdefgh | gfedcba
cv2.BORDER_REFLECT101 gfedcb | abcdefgh | gfedcba
cv2.BORDER_DEFAULT gfedcb | abcdefgh | gfedcba
cv2.BORDER_TRANSPARENT uvwxyz | abcdefgh | ijklmno
cv2.BORDER_ISOLATED 관심 영역 (ROI) 밖은 고려하지 않음



Result


Sobel

3


Laplacian

4


Canny

2



Book Image

개정판이 출간됐습니다!

C#과 파이썬을 활용한 OpenCV 4 프로그래밍 (개정판)

컴퓨터 비전 기초 이론부터 머신러닝을 활용한 영상 처리 프로젝트까지

  • C#과 파이썬용 OpenCV의 데이터 형식과 행렬 및 배열 연산
  • 이미지/동영상/카메라를 활용한 입출력과 결과 저장
  • 전처리 과정과 정보를 탐색하기 위한 이미지 변형
  • 유의미한 정보를 검출하기 위한 이미지 변환
  • 이미지에서 정보를 검출 및 인식
  • 객체 검출을 포함한 모션 추적
  • K-means, KNN, SVM 등의 머신러닝 알고리즘 적용 방법
  • 카페(Caffe), 다크넷(Darknet), 텐서플로 모델을 활용한 딥러닝 모듈 적용 방법
  • Tesseract-OCR과 C# OpenCvSharp4를 활용한 프로젝트
  • 텐서플로와 Python OpenCV4를 활용한 프로젝트
  • 윤대희 저 | 위키북스

    [yes24 바로가기] [알라딘 바로가기] [교보문고 바로가기]

    후원하기


    ⤧  Previous post Python OpenCV 강좌 : 제 13강 - 흐림 효과 ⤧  Next post Python OpenCV 강좌 : 제 15강 - HSV
    Python-OpenCV Category