cv2.Canny() PlatoBlockchain 데이터 인텔리전스를 사용하여 Python에서 OpenCV 에지 감지. 수직 검색. 일체 포함.

cv2.Canny()를 사용한 Python의 OpenCV 에지 감지

개요

에지 감지는 우리가 자연스럽게 하는 일이지만 컴퓨터에 대한 규칙을 정의할 때는 쉽지 않습니다. 다양한 방법들이 고안되어 왔지만, 지배적 방법은 1986년 John F. Canny에 의해 개발되었으며, 적절하게 Canny 방법으로 명명되었습니다.

빠르고 상당히 견고하며 현재의 기술 유형에 가장 잘 작동합니다. 가이드가 끝나면 비디오에서 실시간 에지 감지를 수행하고 다음 라인을 따라 무언가를 생성하는 방법을 알게 될 것입니다.

캐니 에지 감지

캐니 방식이란? 다음과 같은 XNUMX가지 작업으로 구성됩니다.

  • 가우스 평활화
  • 그라디언트 계산
  • 비최대 억제
  • 히스테리시스 임계값

가우스 평활화 입력 이미지를 "철거"하고 노이즈를 완화하여 최종 출력을 훨씬 깨끗하게 만드는 첫 번째 단계로 사용됩니다.

이미지 그라디언트 에지 감지를 위해 이전 애플리케이션에서 사용되었습니다. 특히 Sobel 및 Scharr 필터는 이미지 그라디언트에 의존합니다. Sobel 필터는 두 개의 커널로 요약됩니다(GxGy), 어디서 Gx 수평 변화를 감지하는 동안 Gy 수직 변화 감지:

G

x

=

[

-
1

0

+
1

-
2

0

+
2

-
1

0

+
1

]

G

y

=

[

-
1

-
2

-
1

0

0

0

+
1

+
2

+
1

]

이미지 위로 슬라이드하면 각각의 방향으로 선이 "선택"(강조)됩니다. Scharr 커널은 다른 값으로 동일한 방식으로 작동합니다.

G

x

=

[

+
3

0

-
3

+
10

0

-
10

+
3

0

-
3

]

G

y

=

[

+
3

+
10

+
3

0

0

0

-
3

-
10

-
3

]

이 필터는 이미지에 대해 컨볼루션되면 기능 맵을 생성합니다.

cv2.Canny() PlatoBlockchain 데이터 인텔리전스를 사용하여 Python에서 OpenCV 에지 감지. 수직 검색. 일체 포함.

이미지 크레디트: Davidwkennedy

이러한 기능 맵의 경우 다음을 계산할 수 있습니다. 기울기 크기그라데이션 방향 – 즉, 변화가 얼마나 강렬한지(어떤 것이 가장자리일 가능성이 얼마나 높은지) 그리고 변화가 가리키는 방향. Gy는 수직 변화(Y-gradient)를 나타내고 Gx는 수평 변화(X-gradient)를 나타내므로 피타고라스 정리를 간단히 적용하여 크기를 계산하여 "왼쪽"과 "올바른" 방향:

$$
{G} ={제곱트 {{{G} _{x}}^{2}+{{G} _{y}}^{2}}}
$$

크기와 방향을 사용하여 가장자리가 강조 표시된 이미지를 생성할 수 있습니다.

cv2.Canny() PlatoBlockchain 데이터 인텔리전스를 사용하여 Python에서 OpenCV 에지 감지. 수직 검색. 일체 포함.

이미지 크레디트: Davidwkennedy

그러나 – 당신은 또한 벽돌의 구조에서 얼마나 많은 소음이 잡혔는지 알 수 있습니다! 이미지 그라디언트는 노이즈에 매우 민감합니다. 이것이 Sobel 및 Scharr 필터가 구성 요소로 사용된 이유이지만 Canny의 방법에서 유일한 접근 방식은 아닙니다. 가우스 평활화도 여기에 도움이 됩니다.

비최대 억제

Sobel 필터의 눈에 띄는 문제는 가장자리가 실제로 명확하지 않다는 것입니다. 누군가 연필을 들고 선을 그어 이미지의 선화를 그리는 것과는 다릅니다. 빛이 점차적으로 확산되기 때문에 가장자리는 일반적으로 이미지에서 그렇게 선명하지 않습니다. 그러나 우리는 가장자리에서 공통선을 찾고 그 주변의 나머지 픽셀을 억제하여 깨끗하고 얇은 분리선을 대신 생성할 수 있습니다. 이것은 비최대 억제로 알려져 있습니다! 최대가 아닌 픽셀(3×3 커널과 같은 작은 로컬 필드에서 비교하는 픽셀보다 작은 픽셀)은 억제됩니다. 이 개념은 이보다 더 많은 작업에 적용할 수 있지만 지금은 이 컨텍스트에 바인딩해 보겠습니다.

히스테리시스 임계값

많은 비 가장자리는 조명 조건, 이미지의 재료 등으로 인해 가장자리로 평가될 수 있고 그럴 가능성이 있습니다. 이러한 계산 오류가 발생하는 여러 가지 이유로 인해 가장자리가 무엇인지 자동으로 평가하기가 어렵습니다. '티. "실제" 가장자리가 "가짜" 가장자리보다 더 강렬하다는 가정 하에 그라디언트를 임계값으로 설정할 수 있으며 더 강한 그라디언트만 포함할 수 있습니다.

임계값은 평소와 거의 동일한 방식으로 작동합니다. 그래디언트가 더 낮은 임계값 미만이면 제거하고(XNUMX으로 설정) 지정된 상단 임계값보다 높으면 그대로 유지합니다. 하한과 상한 사이의 모든 것은 "회색 영역"에 있습니다. 임계값 사이의 가장자리가 결정적인 가장자리 (임계값 위의 것) – 또한 가장자리로 간주됩니다. 연결되어 있지 않으면 잘못 계산된 가장자리의 아피캣일 가능성이 큽니다.

히스테리시스 임계값입니다! 실제로, 거짓 가장자리로 분류하는 항목에 따라 최종 출력을 정리하고 거짓 가장자리를 제거하는 데 도움이 됩니다. 좋은 임계값을 찾으려면 일반적으로 임계값에 대해 서로 다른 하한 및 상한을 실험하거나 Otsu의 방법 또는 삼각형 방법과 같은 자동화된 방법을 사용합니다.

이미지를 로드하고 그레이스케일 처리해 보겠습니다(Sobel/Scharr에서 이미지를 그레이스케일해야 하는 것처럼 Canny).

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('finger.jpg', cv2.IMREAD_GRAYSCALE)
img_blur = cv2.GaussianBlur(img, (3,3), 0)

plt.imshow(img_blur, cmap='gray')

cv2.Canny() PlatoBlockchain 데이터 인텔리전스를 사용하여 Python에서 OpenCV 에지 감지. 수직 검색. 일체 포함.

손가락의 근접 촬영 이미지는 가장자리 감지를 위한 좋은 테스트 장소가 될 것입니다. 이미지에서 지문을 식별하는 것은 쉽지 않지만 대략적으로 지문을 식별할 수 있습니다.

cv2.Canny()를 사용한 이미지의 가장자리 감지

Canny의 알고리즘은 OpenCV를 사용하여 적용할 수 있습니다. Canny() 방법:

cv2.Canny(input_img, lower_bound, upper_bound)

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

하한과 상한 사이의 올바른 균형을 찾는 것은 까다로울 수 있습니다. 둘 다 낮으면 가장자리가 거의 없습니다. 하한이 낮고 상한이 높으면 노이즈가 발생합니다. 둘 다 높고 서로 가까우면 가장자리가 거의 없습니다. 올바른 지점은 경계 사이에 충분한 간격이 있고 올바른 규모에 있습니다. 실험!

입력 이미지는 Canny 방법으로 흐리게 처리되지만 종종 흐리게 처리하는 것이 좋습니다. 전에 그것도 들어갑니다. 이 방법은 나머지 작업을 수행하기 전에 입력에 5x5 가우시안 흐림 효과를 적용하지만 이 흐림 효과에도 불구하고 일부 노이즈는 여전히 스며들 수 있으므로 알고리즘에 이미지를 제공하기 전에 이미지를 흐리게 처리했습니다.


edge = cv2.Canny(img_blur, 20, 30)

fig, ax = plt.subplots(1, 2, figsize=(18, 6), dpi=150)
ax[0].imshow(img, cmap='gray')
ax[1].imshow(edge, cmap='gray')

결과 :

cv2.Canny() PlatoBlockchain 데이터 인텔리전스를 사용하여 Python에서 OpenCV 에지 감지. 수직 검색. 일체 포함.

가치 2030 여기에 임의적이지 않습니다. 다양한 매개변수에 대한 방법을 테스트했으며 적절한 결과를 생성하는 것으로 보이는 집합을 선택했습니다. 이것을 자동화할 수 있습니까?

cv2.Canny()에 대한 자동 임계값?

최적의 임계값 집합을 찾을 수 있습니까? 예, 하지만 항상 작동하는 것은 아닙니다. 좋은 값에 대해 자체 계산을 수행한 다음 로 범위를 조정할 수 있습니다. sigma 해당 임계값 주변:

lower_bound = (1-sigma)*threshold
upper_bound = (1+sigma)*threshold

인셀덤 공식 판매점인 sigma, 즉, 0.33 – 경계는 0.66*threshold1.33*threshold, 주위에 ~1/3 범위를 허용합니다. 그래도 찾는 threshold 더 어려운 것입니다. OpenCV는 Otsu의 방법(이중 모드 이미지에 적합)과 삼각형 방법을 제공합니다. 픽셀 값의 간단한 중앙값을 세 번째 옵션으로 취하는 것 뿐만 아니라 두 가지를 모두 시도해 보겠습니다.

otsu_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_OTSU)
triangle_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_TRIANGLE)
manual_thresh = np.median(img_blur)

def get_range(threshold, sigma=0.33):
    return (1-sigma) * threshold, (1+sigma) * threshold

otsu_thresh = get_range(otsu_thresh)
triangle_thresh = get_range(triangle_thresh)
manual_thresh = get_range(manual_thresh)

print(f"Otsu's Threshold: {otsu_thresh} nTriangle Threshold: {triangle_thresh} nManual Threshold: {manual_thresh}")

결과 :

Otsu's Threshold: (70.35, 139.65) 
Triangle Threshold: (17.419999999999998, 34.58) 
Manual Threshold: (105.18999999999998, 208.81)

이것들은 꽤 다릅니다! 이전에 본 값에서 여기에서 가장 잘 작동하는 삼각형 방법을 예상할 수 있습니다. 수동 임계값은 중간 픽셀 값만 사용하고 이 이미지의 넓은 범위로 추가로 곱해지는 높은 기본 임계값을 갖기 때문에 정보가 많지 않습니다. Otsu의 방법은 이것으로 인해 덜 고통을 받지만 그럼에도 불구하고 고통을 겪습니다.

우리가 실행하면 Canny() 다음 임계값 범위를 사용하는 방법:

edge_otsu = cv2.Canny(img_blur, *otsu_thresh)
edge_triangle = cv2.Canny(img_blur, *triangle_thresh)
edge_manual = cv2.Canny(img_blur, *manual_thresh)

fig, ax = plt.subplots(1, 3, figsize=(18, 6), dpi=150)
ax[0].imshow(edge_otsu, cmap='gray')
ax[1].imshow(edge_triangle, cmap='gray')
ax[2].imshow(edge_manual, cmap='gray')

참고 : 함수는 여러 인수를 예상하고 임계값은 단일 튜플입니다. 우리는 할 수 있습니다 해체 튜플을 접두사로 여러 인수로 *. 이것은 목록과 집합에서도 작동하며 프로그래밍 방식으로 인수를 얻은 후 여러 인수를 제공하는 좋은 방법입니다.

결과 :

cv2.Canny() PlatoBlockchain 데이터 인텔리전스를 사용하여 Python에서 OpenCV 에지 감지. 수직 검색. 일체 포함.

삼각형 방법은 여기에서 꽤 잘 작동했습니다! 다른 경우에도 잘 작동한다는 보장은 없습니다.

cv2.Canny()를 사용하여 비디오에서 실시간 에지 감지

마지막으로 캐니 엣지 디텍션을 영상에 실시간으로 적용해보자! 다음을 사용하여 처리 중인 비디오(완료된 각 프레임)를 표시합니다. cv2.imshow() 표시하려는 프레임이 있는 창을 표시합니다. 하지만 나중에 검사하고 공유할 수 있도록 비디오를 MP4 파일로 저장할 수도 있습니다.

OpenCV를 사용하여 비디오를 로드하려면 VideoCapture() 방법. 우리가 통과하면 0 – 현재 웹캠에서 녹화되므로 웹캠에서도 코드를 실행할 수 있습니다! 파일 이름을 전달하면 파일이 로드됩니다.

def edge_detection_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))), isColor=False)
    
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.GaussianBlur(frame, (3, 3), 0)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            edge = cv2.Canny(frame, 50, 100)
            out.write(edge)
            cv2.imshow('Edge detection', edge)
        else:
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()

edge_detection_video('secret_video.mp4')

XNUMXD덴탈의 VideoWriter 출력 파일 이름, FourCC(비디오를 인코딩하는 데 사용되는 코덱을 나타내는 XNUMX개의 코덱 코드), 프레임 속도 및 튜플의 해상도와 같은 여러 매개변수를 허용합니다. 비디오를 추측하거나 크기를 조정하지 않기 위해 우리는 원본 비디오의 너비와 높이를 사용했습니다. VideoCapture 너비, 높이, 총 프레임 수 등과 같은 비디오 자체에 대한 데이터를 포함하는 인스턴스

캡처가 열려 있는 동안 다음 프레임을 읽으려고 합니다. cap.read(), 결과 코드와 다음 프레임을 반환합니다. 결과 코드는 True or False, 다음 프레임의 존재 또는 부재를 나타냅니다. 프레임이 있는 경우에만 추가 처리를 시도하고, 그렇지 않으면 루프를 중단합니다. 각각의 유효한 프레임에 대해 가우스 블러를 통해 실행하고 그레이스케일로 변환하고 실행합니다. cv2.Canny() 그것을 사용하여 작성하십시오. VideoWriter 디스크에 저장하고 다음을 사용하여 표시합니다. cv2.imshow() 라이브 뷰를 위해.

마지막으로 캡처 및 비디오 라이터를 릴리스합니다. 둘 다 디스크의 파일로 작업하고 기존 창을 모두 파괴하기 때문입니다.

다음을 사용하여 메서드를 실행할 때 secret_video.mp4 입력 – 창이 팝업되고 완료되면 작업 디렉토리에 있는 파일이 표시됩니다.

cv2.Canny() PlatoBlockchain 데이터 인텔리전스를 사용하여 Python에서 OpenCV 에지 감지. 수직 검색. 일체 포함.

결론

이 가이드에서는 Canny 에지 감지의 작동 방식과 그 구성 요소인 가우스 평활화, 소벨 필터 및 이미지 그라디언트, 비최대 억제 및 히스테리시스 임계값을 살펴보았습니다. 마지막으로 Canny edge 감지를 위한 자동 임계값 범위 검색 방법을 살펴보았습니다. cv2.Canny(), 그리고 비디오에 기술을 사용하여 실시간 에지 감지를 제공하고 결과를 비디오 파일에 저장합니다.

더 나아가기 – 컴퓨터 비전을 위한 실용적인 딥 러닝

당신의 호기심 많은 성격이 당신을 더 멀리 가고 싶게 만드나요? 다음을 확인하는 것이 좋습니다. 코스: “파이썬을 이용한 컴퓨터 비전을 위한 실용적인 딥러닝”.

cv2.Canny() PlatoBlockchain 데이터 인텔리전스를 사용하여 Python에서 OpenCV 에지 감지. 수직 검색. 일체 포함.

또 다른 컴퓨터 비전 과정?

우리는 MNIST 숫자나 MNIST 패션의 분류를 하지 않을 것입니다. 그들은 오래전에 자신의 역할을 다했습니다. 고급 블랙박스 아키텍처가 성능 부담을 짊어지게 하기 전에 너무 많은 학습 리소스가 기본 데이터 세트와 기본 아키텍처에 집중하고 있습니다.

우리는 집중하고 싶다 신비화, 실용적인 사항, 이해, 직관실제 프로젝트. 배우고 싶다 방법 당신은 변화를 만들 수 있습니다? 우리는 뇌가 이미지를 처리하는 방식부터 유방암에 대한 연구 수준의 딥 러닝 분류기를 작성하고 "환각"하는 딥 러닝 네트워크에 이르기까지, 실제 작업을 통해 원리와 이론을 가르치고, 컴퓨터 비전을 해결하기 위해 딥러닝을 적용하는 전문가가 되기 위한 노하우와 도구.

안에 무엇입니까?

  • 비전의 첫 번째 원칙과 컴퓨터가 "보는" 방법을 가르칠 수 있는 방법
  • 컴퓨터 비전의 다양한 작업 및 응용
  • 작업을 더 쉽게 만들어줄 무역 도구
  • 컴퓨터 비전용 데이터세트 찾기, 생성 및 활용
  • 컨볼루션 신경망의 이론과 응용
  • 데이터 세트의 도메인 이동, 동시 발생 및 기타 편향 처리
  • Transfer Learning 및 다른 사람의 교육 시간 및 계산 리소스를 귀하의 이익을 위해 활용
  • 최첨단 유방암 분류기 구축 및 교육
  • 주류 아이디어에 건강한 회의론을 적용하고 널리 채택된 기술의 의미를 이해하는 방법
  • t-SNE 및 PCA를 사용하여 ConvNet의 "개념 공간" 시각화
  • 기업이 더 나은 결과를 얻기 위해 컴퓨터 비전 기술을 사용하는 방법에 대한 사례 연구
  • 적절한 모델 평가, 잠재 공간 시각화 및 모델의 관심 식별
  • 도메인 연구 수행, 자체 데이터 세트 처리 및 모델 테스트 설정
  • 최첨단 아키텍처, 아이디어의 진행, 독창적인 요소 및 구현 방법
  • KerasCV – 최첨단 파이프라인 및 모델 생성을 위한 WIP 라이브러리
  • 논문을 구문 분석하고 읽고 직접 구현하는 방법
  • 용도에 따른 모델 선택
  • 엔드 투 엔드 머신 러닝 파이프라인 만들기
  • Faster R-CNN, RetinaNets, SSD 및 YOLO를 통한 물체 감지에 대한 풍경 및 직관
  • 인스턴스 및 시맨틱 분할
  • YOLOv5를 사용한 실시간 객체 인식
  • YOLOv5 객체 감지기 훈련
  • KerasNLP(업계 최강의 WIP 라이브러리)를 사용하여 Transformers 작업
  • Transformer를 ConvNet과 통합하여 이미지 캡션 생성
  • Deepdream
  • 컴퓨터 비전을 위한 딥 러닝 모델 최적화

타임 스탬프 :

더보기 스택카부스