OpenCV sobel() 함수
OpenCV 라이브러리를 사용하여 다양한 기술을 이미지에 처리하고 적용할 수 있습니다. 이러한 프로세스는 복잡한 Computer Vision 작업의 필수적인 부분을 형성하며 이러한 작업 중 하나는 이미지의 가장자리 감지입니다.
가장자리는 이미지에서 개체의 경계 또는 윤곽선이며 픽셀 밀도의 매우 큰 변화와 관련이 있습니다. 인접 픽셀의 밀도를 비교하여 가장자리를 감지할 수 있습니다.
에지 감지를 위해 다양한 알고리즘을 사용할 수 있으며 OpenCV 라이브러리에 적용됩니다. 그러한 기술 중 하나는 Sobel Edge Detection 알고리즘입니다.
이 튜토리얼은 Python에서 OpenCV를 사용하는 Sobel 알고리즘을 보여줍니다.
Python에서 OpenCV를 사용한 Sobel()
함수를 사용한 에지 감지
Sobel Edge Detection 알고리즘은 이미지 기울기를 사용하여 이미지의 가장자리를 예측하고 찾습니다. 이 알고리즘을 사용하여 가장자리를 감지하기 위해 픽셀 밀도를 비교합니다.
피크 포인트를 찾기 위해 함수의 1차 도함수를 계산합니다. 그런 다음 임계값과 비교됩니다.
이 기술에서 Sobel 연산자는 함수의 기울기를 계산합니다. 가우스 평활화와 미분화를 결합합니다.
일반적으로 커널을 사용하여 이미지를 매끄럽게 하거나 흐리게 하지만 이 경우에는 그라디언트를 계산하는 데 커널을 사용합니다. 도함수는 x축과 y축 모두를 따라 계산됩니다.
주어진 지점에서의 기울기는 이 두 값을 모두 사용하여 계산됩니다. 이 그래디언트 값은 노이즈가 덜 발생하기 때문에 에지 감지에 사용됩니다.
OpenCV 라이브러리는 Sobel()
함수를 사용하여 이를 구현합니다. 이미지와 함께 여러 매개변수를 사용하여 함수를 지정해야 합니다.
ddepth
매개변수로 지정된 최종 이미지의 깊이를 언급해야 합니다. 값이 -1이면 출력 이미지는 입력 이미지와 동일한 깊이를 갖습니다.
사용할 도함수의 순서는 dx
및 dy
매개변수를 사용하여 지정됩니다. 확장된 Sobel 커널의 크기는 ksize
매개변수를 사용하여 언급됩니다.
scale
및 delta
매개변수는 선택 사항입니다. 이제 예를 살펴보겠습니다.
import cv2
i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)
edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5)
cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()
출력:
위의 예에서는 Sobel()
함수를 사용했습니다. x 및 y축을 따라 1차 도함수를 계산하고 기울기를 구한 다음 윤곽선을 찾는 데 사용합니다.
최종 이미지는 ddepth
매개변수에 지정된 대로 64비트입니다. 사용된 커널의 크기는 5x5입니다.
GaussianBlur()
함수에 유의하십시오. 주어진 이미지를 흐리게 하는 데 사용되며 Sobel 연산자는 흐림 이미지에서 가장 잘 작동합니다. waitKey()
및 destroyAllWindows()
함수는 출력 창이 닫히는 것을 방지하고 사용자가 종료하기 위해 일부 키를 누를 때까지 기다립니다.
논의한 바와 같이 위의 예에서 x 및 y축을 따라 도함수를 계산했습니다. 우리는 또한 다른 축의 도함수를 0으로 하여 어느 한 축과 함께 도함수를 계산할 수도 있습니다.
예를 들어,
import cv2
i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)
edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)
cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()
출력:
위의 코드에서 우리는 수평 방향으로만 도함수를 계산하고 dy
매개변수의 값을 0으로 넣습니다. 수직으로 도함수를 계산하려면 dx
매개변수를 0으로 넣습니다.
이 예에서는 커널 크기를 5x5로 사용했습니다. 3x3 크기를 사용할 수도 있지만 이 경우 결과에 부정확성이 많이 포함되므로 권장하지 않습니다.
Scharr 필터는 Sobel과 유사한 또 다른 연산자이며 3x3 경우에 사용할 수 있습니다.
결론
이 튜토리얼은 OpenCV 라이브러리의 Sobel()
함수를 사용하여 시연했습니다. 먼저 Edge Detection을 위한 Sobel 알고리즘에 대한 이해부터 시작했습니다.
이미지 기울기의 기본 사항과 Sobel 연산자가 이를 효율적으로 계산하는 방법을 이해했습니다. 다양한 상황의 예가 기사에 나와 있습니다.
3x3 커널을 사용하는 것의 단점도 논의되며 이 경우 더 나은 결과를 제공하기 위해 대안인 Scharr 필터를 사용할 수 있습니다.
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn관련 문장 - Python OpenCV
- OpenCV ArUco 마커
- OpenCV 이미지 회전
- OpenCV 이미지에 텍스트 넣기
- OpenCV 임계값
- OpenCV 패키지 구성
- OpenCV를 사용하여 이미지에서 Bitwise_AND 활용