opencv 이미지 윤곽 구현 예제

이미지 윤곽
윤곽:윤곽
윤곽 은 연결 되 지 않 은 가장 자 리 를 연결 하 는 것 이다.
테두리 검출 테두리 검출 테두리 가 연결 되 지 않 았 습 니 다.

문제 에 주의 하 다
1.대상 은 2 치 이미지 이 고 먼저 한도 값 분할 또는 가장자리 검 사 를 실시한다.
2.윤곽 을 찾 으 려 면 원본 그림 을 변경 해 야 합 니 다.보통 원본 그림 의 일부분 을 사용 하여 복사 합 니 다.
3.opencv 에 서 는 검은색 배경 에서 흰색 을 찾 습 니 다.따라서 대상 은 흰색,배경 은 검은색 이 어야 한다.
방법.
  • cv2.findContours()
  • cv2.drawContours()
  • cv2.find Contours()를 통 해 윤곽 이 어디 에 있 는 지 찾 은 다음 cv2.draw Contours()를 통 해 찾 은 윤곽 을 그립 니 다.
    contours,hierarchy=cv2.findContours(image,mode,method)
    윤곽
    hierarchy:이미지 의 토폴로지 정보(윤곽 차원)(이전 윤곽,부모 윤곽 저장...)
    이미지:원본 이미지
    mode:윤곽 검색 방식
    method:윤곽 의 근사 한 방법

    
    r=cv2.drawContours(image, contours, contourIdx, color[, thickness])
    r:대상 그림
    image:원본 이미지
    contours:모든 입력 윤곽 가장자리 배열
    contourIdx:그 려 야 할 가장자리 색인 입 니 다.모두-1 로 그 려 지면.여러 목표 가 있 으 면 첫 번 째 목표 0,두 번 째 목표 1,세 번 째 목표 2 를 그 릴 수 있 습 니 다.
    color:BGR 형식의 SCalar 로 그 려 진 색
    thickness:선택 가능,그리 기 밀도,즉 윤곽 의 붓 굵기
    
    import cv2
    import numpy as np
    o = cv2.imread('lena256.bmp')
    gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)#BGR-  
    ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)#    
    contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    co=o.copy()#         
    r=cv2.drawContours(co,contours,-1,(0,127,127),4)#co     ,         
    cv2.imshow("original",o)
    cv2.imshow("contours",r)
    cv2.waitKey()

    cv2.cvtColor(input_image,flag)색상 공간 변환 에 사용 합 니 다.
    input_image:변환 할 그림
    flag:형식 변환
    cv2.COLOR_BGR2GRAY:BGR-그 레이스 케 일
    cv2.COLOR_BGR2RGB:BGR-RGB
    cv2.COLOR_BGR2HSV:BGR-HSV
    최소 외접원
    함수 cv2.minEnclosing Circle()은 대상 의 외 접 원 을 찾 을 수 있 습 니 다.그것 은 대상 을 포함 할 수 있 는 모든 원 중 면적 이 가장 작은 것 이다.
    사례:현재 다음 그림 은 그림 중심 에 있 는 꽃 을 표시 해 야 합 니 다.

    코드:
    
    import numpy as np
    import cv2 as cv
    
    img=cv.imread("image.jpg",0)
    
    #      ,         
    x,y=img.shape
    img=cv.resize(img,(y//2,x//2))
    #      ,          ,         cv.THRESH_TOZERO_INV    
    ret,thresh=cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
    #        ,mode=cv.RETR_EXTERNAL,            
    im,contour,hierarchy=cv.findContours(thresh,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
    
    #cv.minEnclosingCircle        ndarray  ,        
    #                 ,            
    point_list=[]
    for i in contour:
      for j in i:
        point_list.append(j[0])
    point_array=np.array(point_list)
    
    #         ,                  
    (x,y),radius=cv.minEnclosingCircle(point_array)
    
    #          ,          ,          int  
    center=(int(x),int(y))
    color=cv.cvtColor(img,cv.COLOR_GRAY2BGR)
    color=cv.circle(color,center,radius=int(radius),color=(0,0,255),thickness=2)
    #    
    cv.imshow("color",color)
    cv.waitKey(0)
    cv.destroyAllWindows()
    프로그램 결과:

    볼록 가방
    볼록 가방 은 윤곽 과 비슷 하지만 다른 경우 도 있 지만 결 과 는 같다.함수 cv2.convexHull()은 곡선 이 돌출 성 결함 이 있 는 지 확인 하고 결함 을 바로 잡 을 수 있 습 니 다.일반적으로 볼록 곡선 은 항상 튀 어 나 와 적어도 평평 하 다.opencv 에서 함수 cv.convexhull 을 사용 하여 윤곽 의 볼록 패 키 지 를 찾 습 니 다.이 함수 의 정 의 는:
    hull=cv.convexHull( points[, hull[, clockwise[, returnPoints]]])
    이 함수 의 매개 변 수 는 다음 과 같다.
    Points:들 어 오 는 윤곽 이 필요 합 니 다.
    Hull:출력,보통 필요 하지 않 습 니 다.
    clockwise:취향 표지,True 라면 볼록 가방 의 방향 은 시계 방향 이 고 그렇지 않 으 면 시계 반대 방향 입 니 다.
    returnPoints:기본 값 은 True 입 니 다.돌출 점 의 좌 표를 되 돌려 줍 니 다.False 로 설정 하면 돌출 점 에 대응 하 는 윤곽 의 점 을 되 돌려 줍 니 다.
    아니면 위의 이 그림 입 니까?우 리 는 위의 코드 를 약간 수정 하면 돌출 된 가방 의 모양 을 얻 을 수 있 습 니 다.코드 는 다음 과 같 습 니 다.
    
    import numpy as np
    import cv2 as cv
    
    img=cv.imread("image.jpg",0)
    
    #      ,         
    x,y=img.shape
    img=cv.resize(img,(y//2,x//2))
    #      ,          ,         cv.THRESH_TOZERO_INV    
    ret,thresh=cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
    #        ,mode=cv.RETR_EXTERNAL,            
    im,contour,hierarchy=cv.findContours(thresh,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
    
    #cv.minEnclosingCircle        ndarray  ,        
    #                 ,            
    point_list=[]
    for i in contour:
      for j in i:
        point_list.append(j[0])
    point_array=np.array(point_list)
    
    #    ,         
    hull=cv.convexHull(point_array,returnPoints=True)
    color=cv.cvtColor(img,cv.COLOR_GRAY2BGR)
    
    #       ,      :                
    #      cv.ploylines,                 
    color=cv.polylines(color,[hull],True,(0,0,255),2)
    #    
    cv.imshow("color",color)
    cv.waitKey(0)
    cv.destroyAllWindows()
    프로그램 실행 결 과 는:

    그림 마스크 와 픽 셀 점
    때때로 우 리 는 대상 을 구성 하 는 모든 픽 셀 점 이 필요 합 니 다.우 리 는 그림 의 모든 윤곽 을 추출 한 다음 함수 cv.draw Contours()를 사용 하여 윤곽 안의 영역 을 지정 한 색 으로 채 울 수 있 습 니 다.그리고 cv.find NonZeros()함 수 를 사용 하여 0 화소 점 이 아 닌 좌 표를 추출 하면 대상 을 구성 하 는 화소 점 을 얻 을 수 있 습 니 다.우 리 는 위의 그림 에서 조작 을 합 니 다.코드 는 다음 과 같 습 니 다.
    
    import numpy as np
    import cv2 as cv
    
    img=cv.imread("image.jpg",0)
    
    #      ,         
    x,y=img.shape
    img=cv.resize(img,(y//2,x//2))
    #      ,          ,         cv.THRESH_TOZERO_INV    
    ret,thresh=cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
    #        ,mode=cv.RETR_EXTERNAL,            
    im,contour,hierarchy=cv.findContours(thresh,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
    #               ,       ,      numpy           
    mask=np.zeros(img.shape,dtype=np.uint8)
    #   thickness   -1,  cv.drawContours                    
    mask=cv.drawContours(mask,contour,contourIdx=-1,color=(255,255,255),thickness=-1)
    
    #  mask      ,       numpy  
    NonZeroPoints=np.array(cv.findNonZero(mask))
    #    ,           ,                  
    NonZeroPoints=NonZeroPoints.reshape((-1,2))
    #                  ,      
    #column row                     
    column=NonZeroPoints[:,0]
    row=NonZeroPoints[:,1]
    #              ,               255
    mask1=np.zeros(img.shape)
    mask1[row,column]=255
    #    
    cv.imshow("mask",mask)
    cv.imshow("mask1",mask1)
    cv.waitKey(0)
    cv.destroyAllWindows()
    프로그램 실행 결과:

    위의 두 그림 의 비교 결 과 를 통 해 우 리 는 대상 의 구성 픽 셀 점 이 정확하게 추출 되 었 음 을 알 수 있다.
    여기 서 opencv 이미지 윤곽 의 실현 예제 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 opencv 이미지 윤곽 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기