파이썬을 이용하여 Color Image를 grayScale Image로 바꾸는 법



이번 포스팅을 통해 Color Image를 grayScale Image로 바꿔보도록 하겠습니다.

먼저 바꿀 DataSet을 준비합니다.






저는 위 사진과 같이 여러개의 컬러 이미지를 준비하였습니다. 그리고 디렉토리 구조는 다음과 같습니다.







바꿀 이미지폴더를 소스코드와 같은 디렉토리에 위치시켜놓았습니다.





1
2
3
4
5
6
7
8
9
10
11
12
import cv2
import os
import numpy as np
from PIL import Image
 
path = 'Kang'
imagePaths = [os.path.join(path,file_name) for file_name in os.listdir(path)]
for imagePath in imagePaths:
    img = Image.open(imagePath).convert('L')
    img_numpy = np.array(img, 'uint8')
    cv2.imwrite("Kang\\" + imagePath.split("\\")[-1], img_numpy)
print("All Done")
cs



소스코드를 분석해보면 다음과 같습니다.

일단 필요한 라이브러리들을 import한 뒤


path = 'Kang'   이미지 파일들이 들어있는 폴더 이름을 path에 지정합니다.





imagePaths = [os.path.join(path,file_name) for file_name in os.listdir(path)]


os.listdir() 함수를 사용하면 path 내의 모든 파일명을 리스트로 얻어올 수 있습니다.

이후 os.path.join()을 이용하여 파일명을 path와 결합하여 image파일의 상대경로를 얻습니다.

(예를 들면 여기서는 Kang\User.1.1.png 와 같습니다.)


이미지 파일을 어디에 위치시켰냐에 따라 경로를 달리설정해야 할 수도 있고

경로 설정을 어떻게해야하는지 잘 모르겠다면 맘 편히 절대경로를 사용하셔도 됩니다.





img = Image.open(imagePath).convert('L')


이미지 파일을 연뒤 convert('L') 을 이용하여 grayscale로 바꿔줍니다.





img_numpy = np.array(img, 'uint8')


이후 grayscale을 numpy array로 바꿔준 뒤





cv2.imwrite("Kang\\" + imagePath.split("\\")[-1], img_numpy)


위 코드를 이용하여 저장을 합니다. 저는 color image에 grayscale image를 덮어 씌우기 위해

위와 같이 하였습니다.

imagePath를 slplit()을 이용하여 "\"로 나누어 리스트화한 뒤  => Kang\User.1.1.png 를 [Kang, User.1.1.png] 로 변환.

[-1] 을 이용하여 리스트의 가장 마지막 원소를 얻었습니다.  =>  User.1.1.png


위와 같이 하지 않고 단순히 cv2.imwrite(imagePath, img_numpy)로 하셔도 될 겁니다.

다만 저는 경로를 다르게 지정하는 것을 고려해서 위와 같이 코드를 작성하였습니다.



script를 실행하면 아래와 같은 결과를 얻을 수 있습니다.










============================================================================================


cv2.cvtColor()를 이용한 코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import cv2
import os
import numpy as np
from PIL import Image
 
path = "C:\\Users\\jayfl\\Desktop\\Capston\\DataGathering\\Kang"
imagePaths = [os.path.join(path,file_name) for file_name in os.listdir(path)]
count = 0
for imagePath in imagePaths:
    count += 1
    img = Image.open(imagePath)
    img_numpy = np.array(img, 'uint8')
    gray = cv2.cvtColor(img_numpy, cv2.COLOR_BGR2GRAY)
    cv2.imwrite("C:\\Users\\jayfl\\Desktop\\Capston\\DataGathering\\Gray\\User.1." + str(count) + ".jpg" , gray)
print("All Done")
cs


댓글,

jayharvey

머신러닝/딥러닝 관련 글을 포스팅할 예정입니다 :)