본문 바로가기

Python_파이썬

파이썬 데이터 분석 및 이미지 처리(2) : OpenCV 총정리 및 요약 정리

OpenCV의 소개 및 기본 사용법

  • 영상 처리와 컴퓨터 비전을 위한 오픈소스 라이브러리
  • C, C++, Python 등에서 사용 가능하다.

  • cv2.imread(file_name, flag) 함수 → 이미지를 읽어 Numpy 객체로 만드는 함수
    1. file_name : 읽고자 하는 이미지 파일
    2. flag : 이미지를 읽는 방법 설정
    3. IMREAD_COLOR : 이미지를 Color로 읽고, 투명한 부분은 무시
    4. IMREAD_GRAYSCALE : 이미지를 Grayscale로 읽기
    5. IMREAD_UNCHANGED : 이미지를 Color로 읽고, 투명한 부분도 읽기(Alpha)
    6. 반환 값 : Numpy 객체 (행, 열, 색상 : 기본 BGR)
  • cv2.imshow(title, image) 함수 → 특정한 이미지를 화면에 출력합니다.
    1. title : 윈도우 창의 제목
    2. image : 출력할 이미지 객체
  • cv2.imwrite(file.name, image) 함수 →특정한 이미지를 파일로 저장하는 함수
    1. file_name : 저장할 이미지 파일 이름
    2. image : 저장할 이미지 객체
  • cv2.waitKey(time) 함수 → 키보드 입력을 처리하는 함수
    1. time : 입력 대기시간 (무한대기 : 0)
    2. 반환 값 : 사용자가 입력한 Ascii Code(ESC : 27)
  • cv2.destroyAllWindows() 함수 → 화면의 모든 윈도우를 닫는 함수
import cv2

img_basic =  cv2.imread('file_name.jpg', cv2.IMREAD_COLOR) # 이미지 읽어오는 함수
cv2.imshow('Image Basic', img_basic) # 이미지 보여주는 함수
cv2.waitKey(0) # 키보드 입력을 처리하는 함수
cv2.imwrite('result1.png', img_basic) # 특정 이미지파일로 저장 함수

cv2.destroyAllWindows()

img_gray = cv2.cvtColor(img_basic, cv2.COLOR_BGR2GRAY) # cvtColor를 통해 COLOR 에서 GRAY로 변경
cv2.imshow('Image Gray', img_gray) # 이미지 보여주는 함수
cv2.waitKey(0) # 키보드 입력을 처리하는 함수
cv2.imwrite('result2.png', img_gray) # 특정 이미지파일로 저장 함수

OpenCV 이미지 연산

  • 이미지 크기 및 픽셀 확인
import cv2

image = cv2.imread('image_basic.png')
# 픽셀 수 및 이미지 크기 확인
print(image.shape)
print(omage.size)

# 이미지 Numpmy 객체의 특정 픽셀을 가리킵니다.
px = image[100, 100]

# B, G, R 순서로 출력됩니다.
# Gray Scale : B, G, R로 구분되지 않습니다.
print(px)

# R 값만 출력하기
print(px[2])
  • 특정 범위 픽셀 변경
  • ROI 추출 및 복사
  • 픽셀별로 색상 다루기

OpenCV 이미지 변형

  • 이미지 크기 조절

    1. 보간법(Interpolation) →사이즈가 변할 때 픽셀 사이즈의 값을 조절하는 방법을 의미
    • cv2.resize(image, dsize, fx, fy, interpolation) 함수 → 이미지의 크기를 조절합니다
      1. dsize : Manual Size
      2. fx : 가로 비율
      3. fy : 세로 비율
      4. Interpolation : 보간법
      5. INTER_CUBIC : 사이즈를 크게 할 때 주로 사용
      6. INTER_AREA : 사이즈를 작게 할 때 주로 사용
  • 이미지의 위치 변경

    • cv2. wrapAffine(image, M, dsize) 함수 → 이미지의 위치를 변경한다.
      1. M : 변환 행렬
      2. dsize : Manual Size
  • 이미지의 회전

    • cv2.getRotationMatrix2D(center, angle, scale) 함수 → 이미지의 회전을 위한 반환 행렬을 생성한다.
      1. center : 회전 중심
      2. angle : 회전 각도
      3. scale : Scale Factor

OpenCV 이미지 합치기

  • cv2.add() 함수 → Saturation 연산을 수행한다. 0보다 작으면 0, 255보다 크면 255로 표현 (일종의 clip)
  • np.add() 함수 → Modulo 연산을 수행한다. 256은 0, 257은 1로 표현

OpenCV 임계점 처리하기

  • 이미지의 기본 이진화
    • cv2.threshold(image, thresh, max_value, type) 함수 → 임계값을 기준으로 흑/백으로 분료하는 함수
      1. image : 처리할 Gray Scale 이미지
      2. thresh : 임계 값 (전체 픽셀에 적용), 한계치
      3. max_value : 임계 값을 넘었을 때 적용할 값
      4. type : 임계점을 처리하는 방식
      5. THRESH_BINARY : 임계 값보다 크면 max_value, 작으면 0
      6. THRESH_BINARY_INV : 임계 값보다 작으면 max_value, 크면 0
      7. THRESH_TRUNC : 임계 값보다 크면 임계값, 작으면 그대로
      8. THRESH_TOZERO : 임계 값보다 크면 그대로, 작으면 0
      9. THRESH_TOZERO_INV : 임계 값보다 크면 0, 작으면 그대로
  • 이미지의 적응 임계점 처리
    • 하나의 이미지에 다수의 조명 상태가 존재하는 경우 적용하면 좋다.
    • cv2.adaptiveThreshold(image, max_value, adaptive_method, type, block_size, C) 함수 → 적응 임계점 처리 함수
      1. max_value : 임계 값을 넘었을 때 적용할 값
      2. adaptive_method : 임계 값을 결정하는 계산 방법
      3. ADAPTIVE_THRESH_MEAN_C : 주변영역의 평균값으로 결정
      4. ADAPTIVE_THRESH_GAUSSIAN_C
        1. type : 임계점을 처리하는 방식
        2. block_size : 임계 값을 적용할 영역의 크기
        3. C : 평균이나 가중 평균에서 차감할 값
      5. Adaptive Threshold를 이용하면, 전체 픽셀을 기준으로 임계 값을 적용하지 않습니다

OpenCV Tracker

  • cv2.createTrackbar(track_bar_name, window_name, value, count, on_change) 함수 → Track를 생성하는 함수

    1. value : 초기 값
    2. count : Max 값( Min : 0)
    3. on_change : 값이 변경될 때 호출되는 Callback 함수


import cv2
import numpy as np

def change_color(x):
    r = cv2.getTrackbarPos("R", "Image")
    g = cv2.getTrackbarPos("G", "Image")
    b = cv2.getTrackbarPos("B", "Image")
    image[:] = [b, g, r]

    cv2.imshow("Image", image)

image = np.zeros((600, 400, 3), np.uint8)
cv2.namedWindow("Image")

cv2.createTrackbar("R", "Image", 0, 255, change_color)
cv2.createTrackbar("G", "Image", 0, 255, change_color)
cv2.createTrackbar("B", "Image", 0, 255, change_color)

cv2.imshow("Image", image)
cv2.waitKey(0)

OpenCV 도형 그리기

  • 직선 그리기
    • cv2.line(image, start, end, color, thickness) 함수 → 하나의 직선을 그리는 함수
      1. start : 시작 좌표 (2차원)
      2. end : 종료 좌표 (2차원)
      3. thickness : 선의 두께
  • 사각형 그리기
    • cv2.rectangle(image, start, end, color, thickness) 함수 → 하나의 사각형을 그리는 함수
      1. start : 시작 좌표 (2차원)
      2. end : 종료 좌표 (2차원)
      3. thickness : 선의 두께 (채우기 :-1)
  • 원 그리기
    • cv2.cricle(image, center, radian, color, thickness) 함수 → 하나의 원을 그리는 함수
      1. center : 원의 중심 (2차원)
      2. radian : 반지름
      3. thickness : 선의 두께 (채우기 :-1)
  • 다각형 그리기
    • cv2.polylines(image, points, is_closed, color, thickness) 함수 → 하나의 다각형을 그리는 함수
      1. point : 꼭지점들
      2. is_closed : 닫힌 도형 여부
      3. thickness : 선의 두께 (채우기 :-1)
  • 텍스트 그리기
    • cv2.putText(image, text, position, font_type, font_scale, color) 함수 → 하나의 텍스트를 그리는 함수
      1. position : 텍스트가 출력될 위치
      2. font_type : 글씨체
      3. font_scale : 글씨 크기 가중치

OpenCV Contours

  • Contours 찾기

  • cv2.findContours(image, mode, method) 함수 → 이미지에서 Contour들을 찾는 함수

    1. mode : Contour들을 찾는 방법

    2. RETR_EXTERNAL : 바깥쪽 Line 만 찾기

    3. RETR_LIST : 모든 Line을 찾지만, Hierarchy 구성 X

    4. RETR_TREE : 모든 Line 을 찾으며, 모든 Hierarchy 구성 O

    5. method : Contour들을 찾는 근사치 방법

    6. CHAIN_APPROX_NONE : 모든 Contour 포인트 저장

    7. CHAIN_APPROX_SIMPLE : Contour Line을 그릴 수 있는 포인트만 저장

    ※ 입력 이미지는 Gray Scale Threshold 전처리 과정이 필요합니다

  • Contours 그리기

  • cv2.drawContours(image, contours, contour_index, color, thickness) 함수 → Contour들을 그리는 함수

    1. contour_index : 그리고자 하는 Contours Line (전체 : -1)

OpenCV Contours 처리

  • Contour의 사각형 외각 찾기

  • cv2.boundingRect(contour) 함수 → Contour를 포함하는 사각형을 그립니다.

    1. 사각형의 X, Y 좌표와 너비, 높이를 반환합니다.
  • Contour의 Convex Hull

    • cv2.convexHull(contour) 함수 → Convex Hull 알고리즘으로 외곽을 구성하는 함수
      1. 대략적인 형태의 Contour 외곽을 빠르게 구할 수 있습니다. (단일 Contour 반환)
  • Contour의 유사 다각형 구하기

  • cv2.approxPolyDP(curve, epsilon, cosed) 함수 → 근사치 Contour를 구합니다.

    1. curve : Contour
    2. epsilon : 최대 거리 (클수록 Point 개수 감소)
    3. closed : 폐곡선 여부
  • Contour의 기본 정보

    1. cv2.contourArea(contour) 함수 → Contour의 면적을 구합니다
    2. cv2.arcLength(contour) 함수 → Contour의 둘레를 구합니다.
    3. cv3.moments(contour) 함수 → Contour의 특징을 추출합니다.

OpenCV Filtering

  • 필터링

    • 이미지에 커널을 적용하여 이미지를 흐리게(Blurring = Smoothing) 처리 할 수 있습니다.
    • 이미지를 흐리게 만들면 노이즈 및 손상을 줄일 수 있습니다.
  • 컨볼루션 계산

    • 특정한 이미지에서 커널(Kernel)을 적용해 컨볼루션 계산하여 필터링을 수행할 수 있습니다.