OpenCV (Open Source Computer Vision Library)

Jaho·2021년 12월 19일
0

Python

목록 보기
13/18
post-custom-banner

OpenCV

OpenCV 설치

#파이썬에 설치
pip install opencv-python

#아나콘다에 설치
pip install opencv-contrib-python

1.numpy 에서 배열로 만든 이미지 로드

from PIL import Image  # Image 대문자 확인 잘할것
import numpy as np

im = np.array(Image.open('c:\\myimg\\gujji.jpg'))#이미지 주소
print(type(im))

print(im.dtype)
print(im.shape)  # 행(높이) , 열(폭) ,색상(채널)

#RGB (빨강,초록,파랑) Img.open()
#BGR (파랑,초록,빨강)  cv2.imread()시에 BGR로 읽는다.
#BGR <--> RGB   =  cvtColor()로 변환작업할 수 있다.

type = <class 'numpy.ndarray'>
dtype = uint8
shape = (1440, 1080, 3)

1-1.numpy 에서 배열로 이미지 로드를 한 후 흑백으로 변환 해보자.

#  np.array(PIL.Image.open())  -> shape / PIL.Image.open().convert('L')
im = np.array(Image.open('c:\\myimg\\gujji.jpg').convert('L')) #흑백변환
print(type(im))

print(im.dtype)
print(im.shape)

#쓰기 금지   =  im.flags.writeable   / astype
print(im.flags.writeable)
res = im.astype(np.float64) #astype을 사용 float64로 형변환
print(res.dtype)

im02 = np.array(Image.open('c:\\myimg\\gujji.jpg'), np.float64)
print(im02.dtype)
print(type(im02))

type(im) =<class 'numpy.ndarray'>
im.dtype = uint8
im.shape = (1440, 1080) #채널이 제거됨
im.flags.writeable = True
res.dtype = float64 #astype으로 형변환 후 출력
im02.dtype = float64 #im를 불러올때 float64로 불러옴
type(im02) = <class 'numpy.ndarray'>
float64 = 흑백 이미지로 보여진다.

2.numpy 에서 배열로 만든 이미지 저장

#Image.fromarray(ndarray)(1)    => save() (2)
im = np.array(Image.open('c:\\myimg\\gujji.jpg').convert('L'))
pil_img  = Image.fromarray(im)
print(type(pil_img),'mode : ',pil_img.mode)
pil_img.save('c:\\myimg\\gujjiG.png') #저장

# print(dir(pil_img))
pil_img02  = Image.fromarray(im02.astype(np.uint8))  # 정수로변환 컬러로변환 #float64 = 흑백
print(type(pil_img02),'mode : ', pil_img02.mode)
pil_img02.save('c:\\myimg\\gujjiC.png')

# 유형변환 0~255 까지의 RGB -> 화소값 변환 0.0 ~ 1.0 표현값
# uint8 -> astype()  ->   / 스케일링 작업   -> 값 * 255 -> astype()  -> save()
# jpg (1~95) 기본 값은 75


gujjiG.png


gujjiC.png

Image.fromarray()로 이미지를 배열로만든다.
save(경로 ,이름.파일형식(jpg,png등)
type =<class 'PIL.Image.Image'> mode : L #(흑백)
type =<class 'PIL.Image.Image'> mode : RGB #(컬러)

3. 이미지 처리 : 화소값 처리

# 인덱스 [] 에서 좌표를 지정하여 화소값을 리턴 받는다.
# 행, 열의 순으로 지정, 만약 좌표로 생각 하면 y,x로 순서가 바뀐다. (주의!!)

im = np.array(Image.open('c:\\myimg\\gujji.jpg'))
print(type(im))
print(im.shape)  # 행, 열 ,색상  -> 높이,폭,채널

print('100행의 150번째 화소값을 리턴받자')
print(im[100,150]) # [154 157 150] -> RGB (r,g,b)순
R,G,B = im[100,150]
print(R)
print(G)
print(B)

type = <class 'numpy.ndarray'>
shape = (1440, 1080, 3)
100행의 150번째 화소값을 리턴받자
im[100,150] = [154 157 150]
R = 154 # RED
G = 157 # GREEN
B = 150 # BLUE

구찌를 확인 하자.

import matplotlib.pyplot as plt 
im = Image.open('c:\\myimg\\gujji.jpg')
res = np.asarray(im)

plt.imshow(res)

4.단색 이미지 결합

#np.concatenate()   np.copy()    Image.fromarray()
# 배열의 결합  np.concatenate()    stack   block
im = np.array(Image.open('c:\\myimg\\gujji.jpg')) #배열로 이미지 불러오기

im_R  = im.copy()   # 배열 복사
im_R[:,:,(1,2)] = 0 
# plt.imshow(im_R)
# im_R

im_G  = im.copy()   # 배열 복사
im_G[:,:,(0,2)] = 0
# plt.imshow(im_G)
# im_G

im_B  = im.copy()   # 배열 복사
im_B[:,:,(0,1)] = 0
# plt.imshow(im_B)
# im_B

#이미지 결합
im_RGB = np.concatenate((im_R,im_G,im_B),axis = 1)
im_RGB

#이미지를 배열로 만든다.
res_img = Image.fromarray(im_RGB)
res_img.save('c:\\myimg\\gujjiRGB.png')

im_RGB02 = np.vstack((im_R,im_G,im_B))
res_img02 = Image.fromarray(im_RGB02)
res_img02.save('c:\\myimg\\gujjiRGB02.png')

im_R[:,:,(1,2)] = [r,g,b]의 1,2 번째 인덱스 g,b를 0으로 만든다 --> r (red)색상만 보이게됨
np.hstack = 가로로 이미지 결합
np.vstack = 세로로 이미지 결합


gujjiRGB.png


gujjiRGB02.png

5. 감색처리 : 수를 줄인다

#Image.open()  /   fromarray(Image)   -> save()
#   // 로 나눈 뒤 나머지를 버린 값을 다시 곱하면 픽셀값의 색상 수를 줄일 수 있다.
# // ex) 10/3 = 3.333...   10 // 3*3 = 9   (10으로 3으로나눈 값에 3을 곱한다. 3.333...*3)
from PIL import Image
import numpy as np

im = np.array(Image.open('c:\\myimg\\gujji.jpg')) # 이미지를 배열의 객체로 변환

im_r = im //32*32
im_r02 = im // 128*128

im_RGB = np.concatenate((im,im_r,im_r02),axis = 1)
Image.fromarray(im_RGB).save('c:\\myimg\\temp\\Lena_Res_color.png')

axis = 0 일경우 세로 1일 경우 가로


gujji_Res_color.png

6. 사칙 연산을 이용하여 감마값 구한 다음 보정

im = np.array(Image.open('c:\\myimg\\gujji.jpg'))

im_01 = 255.0 * (im/255.0)**(1/2.2)
im_02 = 255.0 * (im/255.0)**2.2

im_gamma = np.concatenate((im_01,im,im_02),axis = 1)

pil_img = Image.fromarray(np.uint8(im_gamma))
pil_img.save('c:\\myimg\\temp\\gujji_Res_gamma.png')

7. 슬라이싱 작업

import matplotlib.pyplot as plt
im = np.array(Image.open('c:\\myimg\\gujji.jpg'))
print(im.shape)

#구찌의 얼굴만 슬라이싱해보자. (3번의 표를 보고 참고)
im_trim1 = im[600:900,300:750] # y = 600 :900, x = 300 : 750

print(im_trim1.shape)

Image.fromarray(im_trim1).save('c:\\myimg\\temp\\gujji_numpy_trim2.png')

res = np.asarray(im_trim1)
plt.imshow(res)


귀여운구찌 ㅎㅎ
구찌 인스타 ID : @gujji_

profile
개발 옹알이 부터
post-custom-banner

0개의 댓글