#파이썬에 설치
pip install opencv-python
#아나콘다에 설치
pip install opencv-contrib-python
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)
# 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
= 흑백 이미지로 보여진다.
#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 #(컬러)
# 인덱스 [] 에서 좌표를 지정하여 화소값을 리턴 받는다.
# 행, 열의 순으로 지정, 만약 좌표로 생각 하면 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)
#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
#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
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')
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_