Python Opencv 단일 목표 검출 을 위 한 예제 코드

간단 한 소개
목표 검 측 은 이미지 에서 자신 이 관심 이 있 는 부분 을 찾기 위해 다음 작업 을 나 누 어 배경 에 대한 방 해 를 피 할 수 있 습 니 다.다음은 opencv 를 바탕 으로 하 는 단일 목표 검출 알고리즘 을 소개 합 니 다.알고리즘 의 전체적인 사상 은 목표 구역 의 픽 셀 값 을 1 로 설정 하고 배경 구역 을 모두 0 으로 설정 한 다음 에 다른 방법 으로 목표 의 외 접 사각형 을 찾 아 분할 합 니 다.여기 서 전망 과 배경 차이 가 비교적 큰 그림 을 예 로 들 겠 습 니 다.

환경:python 3.7 opencv 4.4.0
2 배경 전경 분리
1 그 레이스 케 일+2 값+형태학 윤곽 특징 과 연결 구성 요소
그림 의 전경 과 배경의 차이 에 따라 이치 화 를 한다.예 를 들 어 뚜렷 한 색채 차이 가 있 는 경우 HSV 색채 공간 으로 전환 하여 분할한다.
원 도

2 그 레이스 케 일

3 이치 화

4 형태학 적 처리

5 윤곽 추출 및 목표 외 접 사각형 찾기
코드 패키지:

def get_roi_contours(image_path, morph_size, num_morph):
  '''
      :
  image_path:        
  morph_size:         
  num_morph:          
  '''
  image = cv2.imread(image_path, cv2.IMREAD_COLOR)
  #    
  gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  #   
  threhold, binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
  #     
  kernel = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=morph_size)
  morph_image = cv2.morphologyEx(binary_image, cv2.MORPH_CLOSE, kernel)
  for i in range(num_morph-1):
    morph_image = cv2.morphologyEx(morph_image, cv2.MORPH_CLOSE, kernel)
  #    
  contours, hierarchy = cv2.findContours(morph_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  #           
  area = 0
  max_area_index = 0
  for j in range(len(contours)):
    if area < cv2.contourArea(contours[j]):
      max_area_index = j
      area = cv2.contourArea(contours[j])
  rect = cv2.boundingRect(contours[max_area_index])
  return rect
6.연결 구성 요 소 를 통 해 외 접 사각형 을 찾 습 니 다.
코드 패키지:

def get_roi_ConCom(image_path, morph_size, num_morph):
  '''
      :
  image_path:        
  morph_size:         
  num_morph:          
  '''
  image = cv2.imread(image_path, cv2.IMREAD_COLOR)
  #    
  gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  #   
  threhold, binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
  #     
  kernel = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=morph_size)
  morph_image = cv2.morphologyEx(binary_image, cv2.MORPH_CLOSE, kernel)
  for i in range(num_morph-1):
    morph_image = cv2.morphologyEx(morph_image, cv2.MORPH_CLOSE, kernel)
  #      
  numlabels, components_img, stats, centers = cv2.connectedComponentsWithStats(morph_image, 8)
  #             
  stats_without_back = stats[1:]
  #                   
  max_area = np.max(stats_without_back, axis=0)[-1]
  #           index
  max_area_index = stats_without_back[:, -1]==max_area
  rect = stats_without_back[max_area_index]
  return np.squeeze(rect)[0:4]
2.Kmeans 집합 은 전망 과 배경의 분 리 를 실현 합 니 다.
1 kmeans 집합 후의 그림 은 클 러 스 터 의 중심 이 무 작위 로 초기 화 되 었 기 때문에 목표 의 픽 셀 값 은 0 일 수도 있 고 1 일 수도 있 습 니 다.opencv 의 find Contours 를 사용 하면 전경 픽 셀 값 을 1 로 요구 합 니 다.

2 윤곽 특징 을 이용 하여 외 접 직사각형 찾기
KMeans 가 클 러 스 터 중심 을 무 작위 로 초기 화하 여 전경 대상 픽 셀 이 불확실 하 므 로 가장자리 추출 방법 으로 윤곽 을 찾 습 니 다.
테두리 그림:

코드 패키지:

def get_roi_Kmeans(image_path):
  image = cv2.imread(image_path, cv2.IMREAD_COLOR)
  image_data = image.reshape(-1, 3).astype(np.float32) #             
  #     ,         
  criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 10, 1)
  interia, label, centers = cv2.kmeans(image_data, 2, None, criteria, 5, cv2.KMEANS_RANDOM_CENTERS)
  #   ,    0    255,    
  label[label==0] = 255
  label[label==1] = 0
  #      ,      uint8    
  thresh_img = label.reshape(image.shape[0:2]).astype(np.uint8)
  x_grad = cv2.Sobel(thresh_img, cv2.CV_32F, 1, 0)
  y_grad = cv2.Sobel(thresh_img, cv2.CV_32F, 0, 1)

  x_grad = cv2.convertScaleAbs(x_grad) #ax + b     
  y_grad = cv2.convertScaleAbs(y_grad)
  
  dst = cv2.add(x_grad, y_grad, dtype=cv2.CV_16S) #   sobel             
  dst = cv2.convertScaleAbs(dst)
  plt.imshow(dst, cmap='gray')
  #         1
  contours, hierarchy = cv2.findContours(dst, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  #      
  rect = cv2.boundingRect(contours[0])
  return rect
삼 총 결
단일 목표 검 측 은 비교적 간단 하 며 목표 와 배경의 차 이 를 합 리 적 으로 이용 하면 분리 할 수 있다.물론 단일 목표 검 측 방법 도 많 습 니 다.예 를 들 어 목표 템 플 릿 이 있 을 때 템 플 릿 이 일치 하거나 평균 값 으로 이동 할 수 있 고 충분 한 데이터 세트 가 있 을 때 기계 학습 과 깊이 있 는 학습 방법 을 사용 할 수 있 습 니 다.
Python Opencv 가 단일 목표 검출 을 실현 하 는 예제 코드 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Opencv 단일 목표 검출 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기