OpenCV - 모듈 설치와 이미지 조작하기


OpenCV(Open Source Computer Vision)

  • 오픈 소스 컴퓨터 비전 라이브러리
  • 객체, 얼굴, 행동 인식 등에서 사용


OpenCV 설치

  • pip : pip install opencv-python
  • conda : conda install -c conda-forge opencv

  • 설치 후 확인

    import cv2
    print(cv2.__version__)
    


MNIST 이미지 출력 해보기

  • 사전 준비 : Keras module 설치
    • Anaconda : conda install -c conda-forge keras
    • Anaconda gpu : conda install -c anaconda keras-gpu
    • Pip : pip install keras
# n번째 이미지 출력
selected_image = 1

# Keras 내장 데이터셋의 MNIST load
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# Draw Digit Image
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,10)) # 출력 이미지 사이즈
ax = fig.add_subplot(1, 1, 1)

# 눈금선
# 주 눈금선은 5, 보조 눈금선은 1 간격 설정
major_ticks = np.arange(0, 29, 5)
minor_ticks = np.arange(0, 29, 1)

ax.set_xticks(major_ticks)
ax.set_xticks(minor_ticks, minor=True)
ax.set_yticks(major_ticks)
ax.set_yticks(minor_ticks, minor=True)

# And a corresponding grid
ax.grid(which='both')

# 격자선
# Or if you want different settings for the grids:
ax.grid(which='minor', alpha=0.2)
ax.grid(which='major', alpha=0.5)

ax.imshow(x_test[selected_image], cmap=plt.cm.binary)
plt.show()

print(y_test[selected_image])
print(x_test[selected_image])

2



Image 그레이스케일로 변경 해보기

  • 사용 Image

    pengsu

import cv2

# Image load
img= cv2.imread('pengsu.jpg')
# 그레이스케일로 변환
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 결과 확인
cv2.imshow('photo', img)
cv2.imshow('photo - gray', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

image



Image 저장하기

# 이미지 불러오기
img = cv2.imread('load_image.png')
# (일련의 수정 과정을 거친 후) 이미지 저장하기
cv2.write('saving.jpg', img)


Image Pixel 하나의 RGB 값 가져오기

img = cv2.imread('load_image.png')
# img 0행 0열의 rgb값
(b, g, r) = img[0,0] # 괄호 없어도 무방 / RGB 순서가 아닌 BGR 순서
# 결과 확인
print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r,g, b))
# Pixel at (0, 0) - Red: 239, Green: 240, Blue: 244
  • Slicing으로 특정 구간 pixel 이미지 가져오기

    img[50:100, 50:100]
    


사각형 / 원 / 선 / 글씨를 그려주는 함수

  • 사각형(cv2.rectangle())

    # cv2.rectangle(적용할 이미지, 좌상단 위치, 우하단 위치, RGB값, 선 두께)
    cv2.rectangle(img, (150,50), (200,100), (0, 255, 0), 5)
    
  • 원(cv2.circle())

    # cv2.circle(적용할 이미지, 원의 중심 위치, 반지름 크기, RGB값, 선 두께)
    cv2.circle(img, (275,75), 25, (0, 255, 255), -1) # 선 두께 -1은 전체를 의미
    
  • 선(cv2.line())

    # cv2.line(적용할 이미지, 시작점 위치, 끝점 위치, RGB값, 선 두께)
    cv2.line(img, (350,100), (400,100), (0,0,255), 5)
    
  • 글씨(cv2.putText())

    # cv2.putText(적용할 이미지, 삽입할 글자, 위치, 글꼴, 글자 크기, RGB값, 글자 두께)
    cv2.putText(img, 'OpenCV', (200, 250), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 4)
    

image



Image 이동 / 회전 / 크기 조정 / 대칭

import cv2
import numpy as np

img = cv2.imread('load_image.jpg')

# Image 높이, 너비 추출
(height, width) = img.shape[:2]
# 중앙 위치 추출
center = (width // 2, height // 2)
  • Image 이동

    # x 방향으로 100, y 방향으로 100 이동하는 matrix 생성
    move = np.float32([[1, 0, 100], [0, 1, 100]])
    # cv2.warpAffine(이동 대상 이미지, 좌표, (출력될 이미지의 너비, 높이))
    moved = cv2.warpAffine(img, move, (width, height))
    

    image


  • Image 회전

    # 우측으로 90도 회전(위에 정의한 center(이미지 중앙위치)를 중심으로)
    rotate = cv2.getRotationMatrix2D(center, -90, 1.0)
    rotated = cv2.warpAffine(img, rotate, (width, height))
    

    image


  • Image 크기 조절

    # 너비 비율 설정
    ratio = 200.0 / width
    # 너비, 너비 비율에 맞는 높이 설정
    dimension = (200, int(height * ration))
    # cv2.resize(적용할 이미지, 너비, 높이, 보간법)
    # 보간법
    	# - 이미지 축소 : 보통 cv2.INTER_AREA 사용
        # - 이미지 확대 : 보통 cv2.INTER_CUBIC + cv2.INTER_LINEAR 사용
        # INTER_AREA : 픽셀 영역 관계를 이용한 resampling 방법
    resized = cv2.resize(img, dimension, interpolation = cv2.INTER_AREA)
      
    

    image


  • Image 대칭

    # cv2.flip(적용할 이미지, 대칭방법)
    # 1 : 좌우대칭, 0 : 상하대칭, -1 : 상하좌우대칭
    flipped = cv2.flip(img, -1)
    

    image

March 9, 2020 에 작성
Tags: python