원쥬
원주는 공부중
원쥬
전체 방문자
오늘
어제
  • 분류 전체보기 (29)
    • Django (0)
    • Vue3 (2)
    • Android (7)
    • Arduino (0)
    • JSPServlet (0)
    • CSS (0)
    • HTML (0)
    • Java (9)
      • Java (9)
      • JavaFestival (0)
    • JavaScript (0)
    • Machine Learning (5)
    • Python (2)
    • Project (1)
      • first_project (1)
      • second_project (0)
      • third_project (0)
    • Tistory (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • machine learning
  • button
  • while문 예제
  • v-bind
  • Python
  • visible
  • android
  • while문
  • textarea 오른쪽 하단
  • 손글씨데이터
  • 폰트바꾸기
  • Ref
  • invisible
  • vscode
  • while
  • AndroidStudio
  • 사라지게하기
  • 안드로이드 스튜디오
  • JSON
  • API
  • matplotlib
  • v-on
  • Vue3
  • Android Stuido
  • 안드로이드
  • pandas
  • volley
  • v-model
  • 영화데이터
  • machinelearning

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
원쥬

원주는 공부중

[Machine Learning] Colab사용 OpenCV 실습
Machine Learning

[Machine Learning] Colab사용 OpenCV 실습

2022. 7. 20. 12:14

Colab 바로가기

 

Google Colaboratory

 

colab.research.google.com

 

Colab에서 단축키 사용 방법 : ctrl +m + 파이썬의 단축키

 

OpenCV 개요

  • 이미지를 처리하기 위한 라이브러리
  • OpenCV : Gray Bradsky에 의해 1996년 인텔에서 시작된 프로제토로 컴퓨터 비전, 머신러닝과 관련된 다양한 알고리즘을 지원하고 있으며 C++, Python, Java 등의 언어를 지원하고 CUDA(Compute Unified Device Architecture), OpenCL (Open Computing Language)에 기반한 인터페이스를 지원
    • OpenCV + Python : OpenCV의 파이썬 API로 C/C++로 된 OpenCV 라이브러리들을 파이썬 래퍼로 감싼 후에 파이썬 모듈을 추가시킨 것
    • 속도문제를 해결하기 위해 속도가 문제되는 코드는 C/C++로 코딩하고 파이썬에서 불러 사용할 수 있는 파이썬 래퍼를 제공
    • OpenCV 배열은 Numpy 배열로 변환되어 내부 처리를 수행 (Numpy로 가능한 모든 연산 가능)
    • Numpy를 활용한 SciPy, Matplotlib 라이브러리와도 호환
# 마이 드라이브에 있는 데이터 연동하는 코드
from google.colab import drive
drive.mount('/content/drive')

# openCV불러오기

import cv2

# 경로 설정 : 데이터 경로 간소하 하기 위해

%pwd

# 경로 변경

%cd/content/drive/MyDrive/Colab Notebooks
%pwd

이미지 불러오기

import cv2
from google.colab.patches import  cv2_imshow # 이미지를 출력하는 함수
img = cv2.imread("data/ryan.png" , cv2.IMREAD_COLOR)

# 출력
cv2_imshow(img)

matplotlib을 활용한 컬러 이미지 로딩

  • 파이썬에서는 색상공간을 bgr로 사용, 하지만 실제 이미지는 rgb로 사용하므로 변환이 필요

 

 cv2.imreadm() : 이미지를 불러오는 함수
 cv2.IMREAD_COLOR : 컬러 계열로 이미지 불러오는 설정

plt.xticks([]) # x축 눈금표시 없애기 
plt.yticks([]) # y축 눈금표시 없애기 
 
-> 현재 bgr컬러로 설정 돼 있기 때문에 우리가 저장한 이미지와 색이 다르게 출력
import cv2
import matplotlib.pyplot as plt

img2 = cv2.imread('data/ryan.png',cv2.IMREAD_COLOR)

# matplotlib 통해 이미지 출력
plt.xticks([]) # 눈금표시 없애기
plt.yticks([])
plt.imshow(img2)
plt.show()

 

# bgr -> rgb 색상공간 변형 코드

img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
import cv2
import matplotlib.pyplot as plt

img2 = cv2.imread('data/ryan.png',cv2.IMREAD_COLOR)
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)

plt.xticks([]) 
plt.yticks([])
plt.imshow(img2)
plt.show()

직접 red 채널과 blue채널 바꾸기

 

- img 확인 해 보기 : array 형태

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('data/ryan.png', cv2.IMREAD_COLOR)
img


# pd.concat : 병합하는 함수 -> 행쪽으로 병합
# pd.merge : 병합하는 함수 -> 특정 컬럼값을 기준으로 두개의 데이터가 열쪽으로 병합

img.shape

b, g, r = cv2.split(img)
# 분리된 채널을 직접 순서를 정해 합치기(병합)
img = cv2.merge([r,g, b])

plt.xticks([])
plt.yticks([])
plt.imshow(img)
plt.show()

- 여러개의 픽셀로 이루어진 이미지

- 픽셀은 이미지의 최소단위

- 픽셀을 채우는 값의 범위 0~255

 

- 0 : 검은표현 -> 붉은색 계열의 값이 작을때

- 255 : 밝은 표현 -> 붉은색 계열의 값이 클때

print(g.shape)
print(g.min())
print(g.max())

print(b.shape)
print(b.min(), b.max())

 

색상공간 변환

  • 시각은 색상정보에 대해 잘 못된 정보를 보내주는 경우가 많음
  • 밤에 색상을 볼때 정확한 색상을 보여주지 못함 - 명도 (검정색이 섞이는 것)
  • 색상에 빛을 강하게 비추는 경우 정확한 색상을 보여주지 못함 - 채도 (흰색이 섞이는 것)
  • 칼라는 너무 많은 정보를 가지고 있기때문에 연산량이 많음 - 실시간 처리가 어려움
  • 따라서 gray 이미지나 binary 이미지로 변환해서 처리
  • gray 이미지 : 0-255로 된 픽섹로만 구성된 흑백이미지
  • 이진 이미지 : 0(검정색)과 255(흰색)으로만 구성된 이미지 (마스크 패턴, 필터링)

 

color -> gray 이미지 변경하는 방법

  • imread() 함수를 쓸 때 색상 설정값을 gray
  • color 설정값으로 읽어서 cvtColor()
  •  
import cv2
import matplotlib.pyplot as plt

# 회색 계열로 뽑았기 때문에 채널 출력 x
img = cv2.imread('data/car.png', cv2.IMREAD_GRAYSCALE)
img.shape

plt.imshow(img, cmap='gray')
plt.show

OCR : 텍스트 검출 (영역 탐색) 및 인식(문자 추출) 기술

1. 테서렉터 ocr 라이브러리

2. easyocr 라이브러리

3. google ocr api 라이브러리

4. keras_ocr 라이브러리

 

easyocr 라이브러리를 사용 해 보자

- easyocr 다운받는 코드

!pip install easyocr
import easyocr
import cv2
import matplotlib.pyplot as plt

text_reader = easyocr.Reader(['ko']) # 한국어 읽도록 설정
# 읽어서 변수에 텍스트 저장
result = text_reader.readtext(img)
for (bbox, text, prob) in result:
  print(text)

Color -> Gray로 변환

import cv2
import matplotlib.pyplot as plt


img = cv2.imread('data/car.png',cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

plt.imshow(img, cmap='gray')
plt.show()

이진화 처리 (Binary Image)

  • 픽셀값이 0과 1로 구성되어진 이미지
 

- 이진화 변형

- 2가지 반환 (값, 값)

- 전자 값 : 결과가 바뀌었다는 뜻/ 후자 값 : 변형된 이미지

- 전자의 값은 의미가 없기 때문에 아무 변수에나 담아주자

- cv2.threshold(img, 문턱값, 표현하고싶은 값) -> 경계값 기준으로 이진화 처리

 

import cv2
import matplotlib.pyplot as plt


img = cv2.imread('data/car.png',cv2.IMREAD_COLOR)
# 그레이스케일로 변형
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_,binary= cv2.threshold(img, 125,255 , cv2.THRESH_BINARY)

plt.imshow(binary, cmap='gray')

plt.title('binary') # 제목 설정
plt.show()

 

  • cv2.threshold(img, threshold_value, value, flag)
    • img : Grayscale 이미지
    • threshold_value : 픽셀 문턱값 (0과 1로 나누기 위한 기준값)
    • value : 문턱값보다 클 때 적용되는 값
    • flag : 문턱값 적용 방법
      • cv2.THRESH_BINARY : 픽셀값이 문턱값보다 크면 value, 아니면 0을 할당
      • cv2.THRESH_BINARY_INV : 픽셀값이 문턱값보다 크면 0, 아니면 value를 할당
      • cv2.THRESH_TRUNC : 픽셀값이 문턱값보다 크면 문턱값, 아니면 픽셀값을 그대로 할당
      • cv2.THRESH_TOZERO : 픽셀값이 문턱값보다 크면 픽셀값, 아니면 0을 할당
      • cv2.THRESH_TOZERO_INV : 픽셀값이 문턱값보다 크면 0, 아니면 픽셀값을 할당

 

이미지 처리 방법

  • 1. 픽셀기반 처리 : 픽셀 단위로 처리
  • 2. 블록기반 처리 : 블록 (픽셀을 그룹화 한 것) 단위로 처리- 필터
  • 3. 주파수기반 처리 : 주파수 영역으로 변환하여 처리 - FFT, DCT, WT 등

이미지 속성

  • OPENCV 이미지를 불러왔을때는 BGR의 형태로 변환하여 가져온다는 것이고, Matplotlib으로 불러올때는 rgb의 형태로 이미지를 가져온다
import cv2

# 색감 설정값 cv2. IMREAD_COLOR
img = cv2.imread('data/lenna.png')

print(img.shape) # 이미지 크기
print(img.size) # 이미지 픽셀 개수
print(img.dtype) # 데이터 타입 - 정수 int

# 색상공간 변형
plt.imshow(img)
plt.show()

# 픽셀 단위로 데이터 확인

b,g,r = img[100 , 200]
# 배열[행,열]
print('b : ', b)
print('g : ', g)
print('r : ', r)

import cv2

# 색감 설정값 cv2. IMREAD_COLOR
img = cv2.imread('data/lenna.png')

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB )

# 색상공간 변형
plt.imshow(img)
plt.show()

# 색상공간 변형 bgr -> rgb
img = cv2.imread('data/lenna.png')

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB )

color = img[100 , 200]
# 배열[행,열]
print(color)

픽셀값 변경해보기

- 라이언 얼굴의 한 부위 점 찍어보기

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('data/ryan.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# cut_img = img[행(y),열(x)]  넘파이 배열 인덱싱 방법
cut_img = img[400:450,300:350]
plt.imshow(cut_img)
plt.show()

img[400:450,300:350] = [255,100,0]
plt.imshow(img)
plt.show()

ROI(Region of Image) : 관심영역

  • 이미지 처리시 필요한 부분에 접근하는 것(얼굴, 손, 눈, 코, 입, 귀)

- 라이언 얼굴 영역 잘라보기

import cv2

face = img[90:580,210:695]
plt.imshow(face)
plt.show()

도형 그리기

  • cv2.line(배경이미지, 시작점좌표, 끝점좌표, 색상, 선두께) : 직선 그리기 함수
  • cv2.circle(배경이미지, 중심좌표, 반지름, 색상, 선두께) : 원 그리기 함수
  • cv2.rectangle(배경이미지, 좌상단점좌표, 우하단점좌표, 색상, 선두께) : 사각형 그리기 함수
  • cv2.ellipse(배경이미지, 중심좌표, 장축/단축길이, 호의시작각, 호의 종료각, 색상, 선두께) : 타원 그리기 함수
  • cv2.putText(배경이미지, 출력내용, 출력시작좌표, 폰트, 크기, 색상, 굵기) : 텍스트 입력 함수

CV_FONT_HERSHEY_SIMPLEX normal size sans-serif font
CV_FONT_HERSHEY_PLAIN small size sans-serif font
CV_FONT_HERSHEY_DUPLEX normal size sans-serif font (more complex than CV_FONT_HERSHEY_SIMPLEX )
CV_FONT_HERSHEY_COMPLEX normal size serif font
CV_FONT_HERSHEY_TRIPLEX normal size serif font (more complex than CV_FONT_HERSHEY_COMPLEX )
CV_FONT_HERSHEY_COMPLEX_SMALL smaller version of CV_FONT_HERSHEY_COMPLEX
CV_FONT_HERSHEY_SCRIPT_SIMPLEX hand-writing style font
CV_FONT_HERSHEY_SCRIPT_COMPLEX more complex variant of CV_FONT_HERSHEY_SCRIPT_SIMPLEX

 

import cv2

# 색감 설정값 cv2. IMREAD_COLOR
img = cv2.imread('data/lenna.png')

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 200:400, 200:340
# (이미지, 상단 좌측 행열, 하단 우측 행열, 테두리컬러, 두께)
img = cv2.rectangle(img,(200,200), (370,390), (0,255,0),10)
# 문자 입력
font = cv2.FONT_HERSHEY_SIMPLEX #폰트이름
# (이미지. 출력문구, 위치, 폰트, 크기, 색, 두께)
img = cv2.putText(img,"Face ROI",(220,180),font,1,(0,255,0),3 )
# 색상공간 변형
plt.imshow(img)
plt.show()

cvlib 얼굴영역 인식하기

- cvlib 다운받는 코드

!pip install cvlib

# 다운 후 import 얼굴인식모듈 사용하기
import cvlib as cv
# 색감 설정값 cv2. IMREAD_COLOR
img = cv2.imread('data/lenna.png')

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB )

# 얼굴인식
faces, confidences = cv.detect_face(img)
print('얼굴 영역 좌표',faces)
# [[좌측x, 좌측y, 우측x, 우측y ]]
print(confidences)

# (이미지, 상단 좌측 행열, 하단 우측 행열, 테두리컬러, 두께)
# 직사각형으로 얼굴 영역 표시하기
img = cv2.rectangle(img, (faces[0][0],faces[0][1]),(faces[0][2],faces[0][3]),(0,255,0),3)

# (이미지. 출력문구, 위치, 폰트, 크기, 색, 두께)
img = cv2.putText(img,"face", (faces[0][0],faces[0][1]-10),font,1,(0,255,0),3)

plt.imshow(img)
plt.show()

 

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread('data/person_face.jpg')

print(img.shape)

# 얼굴 찾기
faces, confidences = cv.detect_face(img)
print(faces)
for (x, y, x2, y2)in faces:

    # 얼굴 roi 지정
    face_img = img[y:y2, x:x2] # 행,열

    # 성별 예측하기
    label, confidence = cv.detect_gender(face_img)
    
    # 각각의 얼굴 영역 박스 표시 
    img = cv2.rectangle(img, (x, y), (x2, y2), (0, 255, 0), 2)
  
    # 이미지, 출력문구, 위치, 폰트, 크기, 색(r,g,b), 두께)
    gender = np.argmax(confidence)
    text = f'{label[gender]}:{confidence[gender]:.1%}'
    img= cv2.putText(img, text, (x-10,y-10), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0), 3)

# 영상 출력
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

저작자표시 (새창열림)

'Machine Learning' 카테고리의 다른 글

[Machine Learning] 손글씨데이터 활용 분류 실습  (0) 2022.07.20
[Machine Learning] 타이타닉 데이터 활용하여 생존/사망 분류 실습02  (0) 2022.07.19
[Machine Learning] 타이타닉 데이터 활용하여 생존/사망 분류 실습01  (0) 2022.07.19
[Machine Learning] Pandas와 Matplotlib을 사용해서 카카오톡 대화 전처리 실습  (0) 2022.07.12
    원쥬
    원쥬
    Git : https://github.com/wonjuju/

    티스토리툴바