ecsimsw

PIL / OpenCV / 이미지 처리 본문

PIL / OpenCV / 이미지 처리

JinHwan Kim 2020. 2. 8. 03:03

PIL / OpenCV / 이미지 처리

 

   - 이미지 처리를 위한 라이브러리를 간단하게만 사용해보았다.

 

   - 영상 안의 사람이나 사물을 인식하고 이를 레이블링 하는 등의 프로젝트를 만들어보면서 공부할 생각이다.   

 

PIL

 

   - 파이썬에서 이미지를 처리하기 위한 대표적인 라이브러리. 

 

Example

 

   - 이미지를 정의한 사이즈의 0,1 이차원 배열로 변환한다.

 

   - 이미지를 회색조로, 크기를 정의한 사이즈로 변경하고, 전체 픽셀 데이터를 2차원으로 표현한 후, 이 전체 픽셀의 평균값을 계산한다. 모든 각 픽셀을 평균값과 비교하여 그보다 크면 1, 작으면 0로 하여 다시 2차원 배열에 저장한다.  

from PIL import Image
import numpy as np
import matplotlib.pyplot as pp

root = "/imgFolder/"
fileName ="XX.PNG"
file= direct+fileName

size = 64

def getIMGdif(file,size):
    img = Image.open(file)
    pp.imshow(img)  #img.show()
    
    img = img.convert('L')
    img = img.resize((size,size),Image.ANTIALIAS)
    pixel_data = img.getdata()
    data= np.array(pixel_data).reshape(size,size)
    avr = data.mean()
    dif = 1*(data>avr)    #-1
    return dif

def saveAsTxt(dif_):
    #-2
    #with open(root+str(fileName)+".txt",mode='w') as f:
    #   for i in dif_:
    #      f.write(str(i.tolist()))
    #     f.write('\n')
    
    np.savetxt(root+str(fileName)+".txt",dif_, fmt='%d', delimiter=' ')  
    print("Saved as ",fileName)

def img2bin(file,size):
    saveAsTxt(getIMGdif(file,size))

img2bin(file,size)

   1. numpy array는 연산자로, 각 행렬마다의 계산을 한번에 처리하고 이를 배열로 반환이 가능하다.

   

   2. numpy.savetxt로 한번에 배열을 저장 가능하다.

 

result

 

64*64 // 이진 배열로 변환한 이미지1
256*256 // 이진 배열로 변환한 이미지2

     - 추출한 바이너리 두 배열을 데이터로 하여 두 이미지를 비교하면, 이미지의 동일 유사 여부 또는 이미지의 한 부분이 어디에 위치하는지 등을 구할 수 있겠다.

 

BinaryIMG.txt
0.00MB

 

OpenCV

 

   - 실시간 이미지 프로세싱에 중점을 둔 라이브러리

 

   - Haar_cascade : 머신러닝으로 특정 개체를 검출하는 알고리즘

 

Example

 

  - 이미지를 회색조로 변경하고, haar cascade를 이용해서 전면 얼굴을 인식한다. 

import cv2

haar_cascade = "haarcascade_frontalface_default.xml"

image = cv2.imread('data_img.jpg')

image_gs = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cascade = cv2.CascadeClassifier(haar_cascade)

face_list = cascade.detectMultiScale(image_gs, scaleFactor=1.1, minNeighbors=1, minSize=(150, 150))

if len(face_list) > 0:
	print("number of face : ", len(face_list))

	color = (0, 0, 255)
	for face in face_list:
		x, y, w, h = face
		cv2.rectangle(image, (x, y), (x+w, y+h), color, thickness=7)

	cv2.imwrite("data_detected.jpg", image)

else:
	print("no face") 

 

   - imread의 return 값이 none type 일 경우 경로에 한글이 들어가진 않았는지 확인 

 

result

 

Comments