본문 바로가기
데이터 이해하기/데이터 다루기

파이썬 이미지 파일, 경로 처리하기 - os, Pillow

by ag_zero 2021. 11. 11.
728x90

 

파일 경로

 

경로를 다루기 위해서는 os 모듈이 필요하다.

import os

 

현재폴더의 경로 확인하기

os.getcwd()

or

%pwd

'C:\\Users\\user\\Desktop\\수업자료\\2차'

 

 

현재폴더에 있는 모든 파일목록 출력하기

os.listdir()

['.ipynb_checkpoints',
 '01 for_while문.ipynb',
 'if 실습 문제.ipynb',
 'images',
 'pic1.jpg',
 'pic2.jpg',
 'pic3.jpg',
 'seoul.csv',
 'test',
 '미션_기상청데이터.ipynb',
 '미션_이미지처리.ipynb',
 '실습_기상청데이터.html',
 '이미지정보.csv']

 

 

os.chdir로 폴더의 경로를 변경할 수 있다.

os.chdir("C:\\Users\\user\\Desktop\\수업자료\\2차\\images")

즉, 현재 폴더는 images가 되었다.

 

현재 경로의 파일 목록을 확인해보면 아래와 같다.

os.listdir()

['강아지1.jpg',
 '강아지10.jpg',
 '강아지2.jpg',
 '강아지3.jpg',
 '강아지4.jpg',
 '강아지5.jpg',
 '강아지6.jpg',
 '강아지7.jpg',
 '강아지8.jpg',
 '강아지9.jpg',
 '고양이1.jpg',
 '고양이2.jpg',
 '고양이3.jpg',
 '고양이4.jpg',
 '고양이5.jpg',
 '고양이6.jpg']

 

상대경로, 절대경로

현재 경로가 절대경로로 되어있기때문에 복잡해 보인다.

상대경로로 바꿔주면 보기가 쉬운것 같아서 왠만하면 상대경로로 바꿔준다!

 

절대경로: "C:\\Users\\user\\Desktop\\수업자료\\2차\\images"

# 상대경로
path='./images/'

잊지말고 '/' 붙이기!

이렇게 바꿀때 마지막에 '/'를 안붙이면 피곤해질 수 있다고 한다.. 

 

이미지 불러오기

이미지를 다루기 위해서 pillow가 필요하다.

pip install pillow
from PIL import Image

 

아래의 코드를 실행하면 해당 사진파일이 실행된다.

img = Image.open("강아지1.jpg")
img.show()

아래의 코드를 실행하면 사진의 정보를 알 수 있다.

print(f'이미지 파일 이름 : {img.filename}')
print(f'이미지 파일형식(format) : {img.format}')
print(f'이미지 용량(size) : {img.size}')
print(f'이미지 색상모드 : {img.mode}')
print(f'이미지 width : {img.width}')
print(f'이미지 height : {img.height}')

이미지 파일 이름 : 강아지1.jpg
이미지 파일형식(format) : JPEG
이미지 용량(size) : (377, 400)
이미지 색상모드 : RGB
이미지 width : 377
이미지 height : 400

 

 

 

미션

강아지 폴더와 고양이 폴더를 만들어 이름에 따라 파일을 분류해서 저장하기 

os.listdir()

['강아지1.jpg',
 '강아지10.jpg',
 '강아지2.jpg',
 '강아지3.jpg',
 '강아지4.jpg',
 '강아지5.jpg',
 '강아지6.jpg',
 '강아지7.jpg',
 '강아지8.jpg',
 '강아지9.jpg',
 '고양이1.jpg',
 '고양이2.jpg',
 '고양이3.jpg',
 '고양이4.jpg',
 '고양이5.jpg',
 '고양이6.jpg']

 

' . '을 기준으로 문자 나누기

'강아지1.jpg'.split('.')

' . '을 기준으로 문자 나눈것 중 첫번째

'강아지1.jpg'.split('.')[0]

 

숫자를 기준으로 문자 나누기

re.split('[0-9]','강아지123.jpg')

['강아지', '', '', '.jpg']

 

 

'[0-9]'를 해도 되지만 '+'를 붙이면 하나이상의 숫자를 기준으로 분리가 된다.

re.split('[0-9]+','강아지123.jpg')

 

['강아지', '.jpg']

 

문자 분리 예시

test='가나다 abc ABC ㄱㄴㄷ ^*,!! 12 3435'
re.findall('[a-zA-Z가-힣0-9]+',test)

['가나다', 'abc', 'ABC', '12', '3435']

 

 

강아지, 고양이 폴더 생성하기

가지고있는 사진 파일명으로 각각의 폴더를 만들어 주었다.

path='./images/'
file_list= os.listdir(path)

new_fold=[]
tmp=''
cat=[]
for i in file_list:
    fn=re.split('[0-9]+',i)[0]
    if fn!=tmp:
        os.mkdir(path+fn)
        new_fold.append(fn)
        tmp=fn
        
print(new_fold)

from PIL import Image

 

모든 사진에 모든 필터를 적용해서 각 이름에 맞는 폴더에 저장하기

filter_list = [ImageFilter.BLUR, ImageFilter.CONTOUR, ImageFilter.DETAIL,
               ImageFilter.EDGE_ENHANCE, ImageFilter.EDGE_ENHANCE_MORE, ImageFilter.EMBOSS, ImageFilter.FIND_EDGES,
               ImageFilter.SHARPEN, ImageFilter.SMOOTH, ImageFilter.SMOOTH_MORE]
for i in file_list:
    img=Image.open("C:/Users/user/Desktop/수업자료/2차/images/{}".format(i))
    fn=re.split('[0-9]+',i)[0]
    sp=i.split('.')[0]
    
    for i in range(len(filter_list)):
            filter_img = img.filter(filter_list[i])
            if fn=='강아지':
                filter_img.save("C:/Users/user/Desktop/수업자료/2차/images/강아지/{}_filter_img_{}.jpg".format(sp,i))
            elif fn=='고양이':
                filter_img.save("C:/Users/user/Desktop/수업자료/2차/images/고양이/{}_filter_img_{}.jpg".format(sp,i))

 

 

결과!