OpenCV - 1
OpenCV - 컴퓨터 비전 라이브러리
설치 - pip install opencv-python
영상은 2차원 행렬.
그레이스케일 영상: 흑백사진이지만 2톤으로 표현된 것이 아니라 밝기 정보를 256단계로 표현
3줄4칸 이미지:
[[12,234,123,89],
[78,54,98,198],
[12,234,123,89]]
트루컬러 영상: 칼라 영상. r, g, b 각각 256 단계로 표현
3줄4칸 이미지:
[[[12,234,123],[78,54,98], [234,123,89], [54,98,198]],
[[78,54,98],[198,234,123,89],[78,54,98], [234,123,89]],
[[12,234,123],[78,54,98], [234,123,89], [54,98,198]]]
2D image img.shape => (h, w, c)
h:세로길이 / w:가로길이 / c:색상(b, g, r)
영상 데이터 타입
<영상 생성="">
```python
import numpy as np
img1 = np.empty((200, 300), dtype=np.uint8)#그레이스케일 이미지
img2 = np.zeros((200, 300, 3), dtype=np.uint8)#칼라 이미지
img3 = np.ones((200, 300), dtype=np.uint8)*255 #그레이스케일 이미지. 흰바탕
img4 = np.full((200, 300, 3), (0, 255, 255), dtype=np.uint8) #칼라 이미지의 노란바탕
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.imshow('img4', img4)
cv2.waitKey(0) #키보드 입력 대기. 입력한 키값 반환
cv2.destroyAllWindows() #모든 윈도우 창 닫음
```
<이미지 읽기="">
cv2.imread('파일경로', flag)
flag - cv2.IMREAD_COLOR: 칼라 이미지. 상수 1
cv2.IMREAD_GRAYSCALE: 흑백 이미지. 상수 0
cv2.IMREAD_UNCHANGED: 알파값도 같이 읽음. 상수 -1
<이미지 출력="">
cv2.imshow(title, img)
title - 제목
img - 출력할 이미지 값(numpy배열. cv2.imread()의 반환값)
```python
import cv2
fname = 'b.jpg'
original = cv2.imread(fname, cv2.IMREAD_COLOR)
gray = cv2.imread(fname, cv2.IMREAD_GRAYSCALE)
unchange = cv2.imread(fname, cv2.IMREAD_UNCHANGED)
print(original.shape)
print(gray.shape)
print(unchange.shape)
cv2.imshow('Original', original)
cv2.imshow('Gray', gray)
cv2.imshow('Unchange', unchange)
cv2.waitKey(0) #키보드 입력 대기. 입력한 키값 반환
cv2.destroyAllWindows() #모든 윈도우 창 닫음
```
(410, 640, 3)
(410, 640)
(410, 640, 3)
```python
original
```
array([[[212, 211, 221],
[208, 207, 217],
[212, 209, 218],
...,
[125, 95, 76],
[123, 96, 76],
[123, 96, 76]],
[[212, 211, 221],
[213, 212, 222],
[224, 220, 231],
...,
[128, 98, 79],
[127, 97, 78],
[125, 98, 78]],
[[229, 229, 241],
[227, 228, 238],
[240, 239, 249],
...,
[129, 99, 80],
[128, 98, 79],
[128, 98, 79]],
...,
[[ 19, 54, 67],
[ 0, 35, 48],
[ 0, 31, 41],
...,
[ 14, 53, 85],
[ 25, 61, 91],
[ 18, 55, 83]],
[[ 15, 53, 65],
[ 23, 58, 71],
[ 0, 31, 41],
...,
[ 52, 93, 126],
[ 42, 80, 112],
[ 38, 76, 106]],
[[ 23, 61, 73],
[ 29, 67, 79],
[ 4, 39, 49],
...,
[ 40, 80, 115],
[ 35, 73, 107],
[ 36, 74, 106]]], dtype=uint8)
```python
original.shape
```
(410, 640, 3)
<이미지 쓰기="">
cv2.imwrite('파일명', img)
img - 저장할 이미지 값(numpy 배열)
```python
import cv2
fname_o = 'b.jpg'
fname_t = 'b_gray.jpg'
gray = cv2.imread(fname_o, cv2.IMREAD_GRAYSCALE)
cv2.imwrite(fname_t,gray)
img = cv2.imread(fname_t)
cv2.imshow('image',img)
cv2.waitKey(0) #키보드 입력 대기
cv2.destroyAllWindows() #모든 윈도우 창 닫음
```
matplot에 이미지 출력
보통 컴퓨터에서 칼라를 표현할때에는 [r,g,b]로 표현하지만 opencv는 [b,g,r]로 표현한다. 그래서 opencv로 읽어들인 이미지를 다른 프로그램을 통해 출력하면 이미지의 색상이 반전되어 출력되므로 출력하기 전 r,g,b를 반전해야 한다.
```python
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('a.jpg', cv2.IMREAD_COLOR)
#opencv로 읽은 이미지를 matplot에 그대로 출력. 색상 반전됨
plt.imshow(img)
#plt.xticks([]) # x축 눈금
#plt.yticks([]) # y축 눈금
plt.show()
```
```python
import cv2
from matplotlib import pyplot as plt # as는 alias 적용시 사용
img = cv2.imread('a.jpg', cv2.IMREAD_COLOR)
#opencv로 읽은 이미지의 r,g,b순서를 뒤집어 배열
b, g, r = cv2.split(img) # img파일을 b,g,r로 분리
img2 = cv2.merge([r,g,b]) # b,,g, r을 바꿔서 Merge
plt.imshow(img2)
plt.xticks([]) # x축 눈금
plt.yticks([]) # y축 눈금
plt.show()
```
이미지>이미지>이미지>영상>