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.IMREAD_COLOR : 컬러 계열로 이미지 불러오는 설정
plt.xticks([]) # x축 눈금표시 없애기
plt.yticks([]) # y축 눈금표시 없애기
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 색상공간 변형 코드
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 |