1. image 결합 

file_name = "checker_board.png"

image = cv2.imread(file_name, cv2.IMREAD_COLOR)
image2 = cv2.imread(file_name, cv2.IMREAD_GRAYSCALE)

image2 = np.stack((image2,)*3, axis=-1)

image = cv2.resize(image, (400,400))
image2 = cv2.resize(image2, (400,400))

image = np.concatenate((image, image2),axis=1)

  • opencv imread 는 numpy 객체로 이미지를 불러오게 된다 그렇기에 numpy 모듈을 사용하여 이미지를 수직, 수평으로 이어붙이기를 하여 원본이미지와 변경 이미지를 한눈에 보기 쉽게 펼칠 수 있다
  • grayscale 이미지와 color 이미지의 차원이 다르기 때문에 grayscale의 차원을 numpy의 stack을 이용하여 같은 이미지를 3번 중복하여 차원을 (x, x, 3) 으로 color 차원과 같게 맞추었다 
  • numpy.concatenate = 넘파이 객체를 잇는다
  • 첫 파라미터는 tuple 형태의 image 객체 2개이고 두 번째 파라미터는 수직 또는 수평을 결정하는 axis 이다
  • axis=0 은 수직(세로)으로 잇는다 axis=1은 수평(가로)으로 잇는다

 

2. 외곽선 검출

image = cv2.imread('milk.jpg', cv2.IMREAD_COLOR)
image2 = image.copy()
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

return_value, threshold_image = cv2.threshold(gray_image,0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)

contours, hierarchy = cv2.findContours(threshold_image, 
                        cv2.RETR_LIST, 
                        cv2.CHAIN_APPROX_NONE)

for contour in contours:
    cv2.drawContours(image,contour,-1,(0,0,255),2)
    
threshold_image = np.stack((threshold_image,)*3, axis=-1)
image = np.concatenate((image,threshold_image), axis=1)
image = np.concatenate((image,image2), axis=1)

    • cv2.threshold( image, min_value, max_value, TYPE )
    • 2차원 이미지만 입력으로 넣을 수 있기 떄문에 grayscale로 변환헀다
    • threshold를 해주는 이유는 외곽선을 찾을 때 색상정보를 단순하게 변경하여 (0과 255로) 외곽선을 더 찾기 쉽게 할 수 있다. 
    • threshold의 파라미터는 (image_source, min_value, max_value, TYPE)이다 
      TYPE의 종류
      cv2.THRESH_BINARY 
      cv2.THRESH_BINARY_INV 
      cv2.THRESH_TRUNC 
      cv2.THRESH_TOZERO 
      cv2.THRESH_TOZERO_INV 
      cv2. THRESH_OTSU : 이진화를 할 때 히스토그램 분석을 통해 자동으로 임계값을 찾아준다

https://opencv-python.readthedocs.io/en/latest/doc/09.imageThresholding/imageThresholding.html

 

    • cv2.findContours( image, mode, method)
    • 이진 이미지에서 외곽선을 자동으로 검출해 준다 
    • mode 의 종류 
      cv2.RETR_EXTERNAL : 외곽선중 가장 바깥쪽 선만 리턴한다 
      cv2.RETR_LIST : 모든 외곽선을 찾지만 계층관계는 구성하지 않는다 
      cv2.RETR_CCOMP : 모든 외곽선을 찾으며 2단계의 계층관계를 구성한다 
      cv2.RETR_TREE : 모든 외곽선을 찾으며 모든 계층관계를 구성한다 
      여기서 계층이란 검출된 외곽선 안에 있는 또다른 외곽선을 뜻한다 
    • method 의 종류
      cv2.CHAIN_APPROX_NONE : 모든 point를 저장
      cv2.CHAIN_APPROX_SIMPLE : 4개의 point만을 저장하여 메모리를 절약 
      cv2.CHAIN_APPROX_TC89_L1 : Teh_Chin 연결 근사 알고리즘 L1버전을 적용하여 point 개수를 줄임 
      cv2.CHAIN_APPROX_TC89_KCOS : Teh_Chin 연결 근사 알고리즘 KCOS 버전을 적용하여 point 개수를 줄임 
      return 값으로 오는 contours의 shape를 찍어보면 각각 method마다 shape이 다른것을 볼 수 있다. 
      각각 method마다의 contours[-1]의 draw 와 shape 

+ Recent posts