Python 은 Opencv 를 사용 하여 가장자리 검 측 및 윤곽 검 측 실현

테두리 검출
Canny 테두리 검출 기 는 광범 위 하 게 사용 되 는 알고리즘 으로 테두리 검출 의 가장 좋 은 알고리즘 으로 여 겨 진다.이 방법 은 고 스 차분 알고리즘 보다 더 복잡 한 기 교 를 사용 했다.예 를 들 어 다방 향 그 레이스 케 일 사다리 와 정체 한도 값 화 등 이다.
Canny 테두리 검출 기 알고리즘 기본 절차:
4.567917.부 드 러 운 이미지:적당 한 퍼 지 반지름 을 사용 하여 고 스 퍼 지 를 실행 하여 이미지 안의 소음 을 감소 합 니 다4.567917.이미지 의 경사도 를 계산 합 니 다.여기 서 이미지 의 경사도 를 계산 하고 경사도 를 수직,수평 과 경사 대각 으로 분류 합 니 다.이 단계 의 출력 은 다음 단계 에서 진정한 가장 자 리 를 계산 하 는 데 사 용 됩 니 다4.567917.비 최대 치 억제:지난 단계 에 계 산 된 경사도 방향 을 이용 하여 특정한 픽 셀 이 경사도 의 정방 향 과 마이너스 방향 에서 국부 최대 치 인지,만약 그렇다면 이 픽 셀(픽 셀 은 가장자리 에 속 하지 않 음)을 억제 합 니 다.이것 은 가장자리 세분 화 기술 로 가장 급격 한 변환 으로 가장자리 점 을 선택한다4.567917.지연 한도 값 으로 가장 자 리 를 선택 합 니 다.마지막 단 계 는 특정한 가장자리 가 최종 출력 으로 충분 한 지 확인 하고 마지막 으로 모든 뚜렷 하지 않 은 가장 자 리 를 제거 합 니 다Opencv 사용 Canny 테두리 검출 은 상대 적 으로 간단 합 니 다.코드 는 다음 과 같 습 니 다.

import cv2
import numpy as np

img = cv2.imread("hammer.jpg", 0)
cv2.imwrite("canny.jpg", cv2.Canny(img, 200, 300))
cv2.imshow("canny", cv2.imread("canny.jpg"))
cv2.waitKey()
cv2.destroyAllWindows()
실행 결과:
这里写图片描述
Canny 함수 의 원형 은?

cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 
필요 한 인자:
첫 번 째 매개 변 수 는 처리 해 야 할 원본 그림 입 니 다.이 그림 은 단일 채널 의 그 레이스 케 일 그림 이 어야 합 니 다.
두 번 째 매개 변 수 는 지연 한도 값 1 이다.
세 번 째 매개 변 수 는 지연 한도 값 2 이다.
윤곽 검사
윤곽 검 사 는 주로 cv2.find Contours 함수 로 이 루어 집 니 다.
함수

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) 
함수 매개 변수
첫 번 째 매개 변 수 는 윤곽 을 찾 는 그림 입 니 다.
두 번 째 매개 변 수 는 윤곽 을 나타 내 는 검색 모델 로 네 가지 가 있다.
  • cv2.RETR_EXTERNAL 은 외부 윤곽 만 검출 한다 고 밝 혔 다
  • cv2.RETR_LIST 검사 의 윤곽 은 등급 관 계 를 맺 지 않 습 니 다
  • cv2.RETR_CCOMP 는 두 등급 의 윤곽 을 만 들 고 위의 한 층 은 외부 경계 이 며 안의 한 층 은 내부 구멍 의 경계 정보 입 니 다.만약 내 공 안에 또 하나의 연결 물체 가 있다 면,이 물체 의 경계 도 꼭대기 층 에 있다
  • cv2.RETR_트 리 는 등급 트 리 구조의 윤곽 을 만 듭 니 다
  • 세 번 째 매개 변수 method 는 윤곽 의 접근 방법 이다.
  • cv2.CHAIN_APPROX_NONE 는 모든 윤곽 점 을 저장 합 니 다.인접 한 두 점 의 픽 셀 위치 차 이 는 1 을 초과 하지 않 습 니 다.즉,max(abs(x1-x2),abs(y2-y1)=1 입 니 다
  • cv2.CHAIN_APPROX_SIMPLE 는 수평 방향,수직 방향,대각선 방향의 요 소 를 압축 하고 이 방향의 종점 좌표 만 유지 합 니 다.예 를 들 어 사각형 윤곽 은 4 개의 점 으로 윤곽 정 보 를 저장 합 니 다
  • cv2.CHAIN_APPROX_TC89_L1 과 cv2.CHAINAPPROX_TC89_KCOS 는 모두 teh-Chinl chain 유사 알고리즘 을 사용 합 니 다
  • 반환 값
    이미지,contours,hier=cv2.findContours(thresh,cv2.RETREXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    이미지
    contours:그림 의 윤곽 은 목록 의 형식 으로 모든 요 소 는 그림 의 윤곽 입 니 다.
    hier:해당 윤곽 간 의 관계.이것 은 ndarray 입 니 다.그 중의 요소 개 수 는 윤곽 갯 수 와 같 습 니 다.각 윤곽 contours[i]는 4 개의 hierarchy 요소 hierarchy[i][0]~hierarchy[i][3]에 대응 하여 각각 뒤의 윤곽,앞의 윤곽,부모 윤곽,내장 윤곽 의 색인 번 호 를 표시 합 니 다.해당 항목 이 없 으 면 이 값 은 마이너스 입 니 다.
    원본 그림:
    这里写图片描述
    예시 1
    
    import cv2
    import numpy as np
    
    img = cv2.pyrDown(cv2.imread("hammer.jpg", cv2.IMREAD_UNCHANGED))
    # threshold             ,               ,  img.copy()      ,cv2.THRESH_BINARY    
    ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY), 127, 255, cv2.THRESH_BINARY)
    # findContours            
    #     thresh     
    #     ,  cv2.RETR_EXTERNAL        ,cv2.RETR_TREE          
    #       
    #       ,image    、contours      、hier     
    image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    for c in contours:
      #        
      # boundingRect       ,x,y    ,w,h       
      x, y, w, h = cv2.boundingRect(c)
      #  img      ,(x, y), (x + w, y + h)     ,(0, 255, 0)      ,2       
      cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    
      #        
      #       
      rect = cv2.minAreaRect(c)
      #            
      box = cv2.boxPoints(rect)
      #          
      box = np.int0(box)
      #     
      cv2.drawContours(img, [box], 0, (0, 0, 255), 3)
    
      #        
      #           
      (x, y), radius = cv2.minEnclosingCircle(c)
      #       
      center = (int(x), int(y))
      radius = int(radius)
      #       
      img = cv2.circle(img, center, radius, (0, 255, 0), 2)
    
    # #        
    #           
    cv2.drawContours(img, contours, -1, (255, 0, 0), 2)
    #     
    cv2.imshow("contours", img)
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    실행 결 과 는 그림 과 같 습 니 다.
    这里写图片描述
    예시 2
    
    import cv2
    import numpy as np
    
    img = cv2.pyrDown(cv2.imread("hammer.jpg", cv2.IMREAD_UNCHANGED))
    ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY) , 127, 255, cv2.THRESH_BINARY)
    # findContours            
    #     thresh     
    #     ,  cv2.RETR_EXTERNAL        ,cv2.RETR_TREE          
    #       
    #       ,image    、contours      、hier     
    image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    #       black
    black = cv2.cvtColor(np.zeros((img.shape[1], img.shape[0]), dtype=np.uint8), cv2.COLOR_GRAY2BGR)
    
    
    for cnt in contours:
      #           。       cv2.arcLength()     。                        (True) ,     (    )
      epsilon = 0.01 * cv2.arcLength(cnt, True)
      #   approxPolyDP           ,cnt     ,epsilon      ,      ,                         。
      #          true,           ,        ,  ,  false,   。
      approx = cv2.approxPolyDP(cnt, epsilon, True)
      # convexHull                ,  cnt     。
      hull = cv2.convexHull(cnt)
      #          
      cv2.drawContours(black, [cnt], -1, (0, 255, 0), 2)
      #           
      cv2.drawContours(black, [approx], -1, (255, 255, 0), 2)
      #            
      cv2.drawContours(black, [hull], -1, (0, 0, 255), 2)
    #     
    cv2.imshow("hull", black)
    cv2.waitKey()
    cv2.destroyAllWindows()
    실행 결 과 는 그림 과 같 습 니 다.
    这里写图片描述
    참고 자료:OpenCV 3 컴퓨터 시각 파 이 썬 언어 구현 2 판
    파 이 썬 이 Opencv 를 사용 하여 테두리 검 측 과 윤곽 검 측 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 테두리 검 측 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기