본문 바로가기
Image Processing/Project

파이썬에서 RGB 이미지를 Grayscale 이미지로 바꾸기

by 리미와감자 2022. 9. 2.

라이브러리를 사용하지 않고 직접 알고리즘을 구현해보는 것이 중요하다.

 

from PIL import Image
import numpy as np

알고리즘 구현에 사용할 라이브러리는 PIL과 numpy이다.

 

 

 

#Option

IMG_FILE = "Girl_with_a_Pearl_Earring.jpg" # Only Use JPG File

SHOW_IMAGE = True

옵션으로 IMG_FILE과 SHOW_IMAGE를 파라미터로 사용한다.

※ 이번 알고리즘에 사용할 이미지는 확장자가 jpg이다. png는 채널이 4개이기 때문에 이번 코드에서는 사용할 수 없다. 4번째 채널은 RGB값이 아니고 알파채널을 의미하는데, 이 값은 단순평균을 낼 때 사용할 수 없다.

 

 

 

img = Image.open(IMG_FILE) # Image File
mode, size = img.mode, img.size # Image Format, Size
width, height = size[0], size[1]
pix = list(img.getdata())

이미지를 불러오는 코드이다.

우선 이미지를 불러와서 변수 img에 저장한다.

Format과 Size는 언제 사용할지 모르니 일단 저장해둔다.

이미지의 width(가로)와 height(세로)도 중요하다.

이미지의 픽셀값을 리스트에 넣는다.

 

 

 

#Convert RGB images to Gray Scale
gray_pix = []
for i in pix:
    gray_val = round(np.mean(i))
    gray_pix.append(gray_val)


gray_pix = np.array(gray_pix)
gray_pix = gray_pix.reshape(height, width)

gray_img = Image.fromarray(gray_pix)

gray_val = round(np.mean(i)) : RGB값의 평균을 낸후 반올림한다. 반올림 하는 이유는 소수값을 없애기 위해서이다.

나머지 코드는 list에서 array로 변환 후 사이즈를 맞춰주고 array에서 이미지로 변환하는 코드이다.

 

 

 

 

 

img.show()
img.close()

마지막으로 이미지를 띄운다.

 


 

## 전체 코드

from PIL import Image
import numpy as np


#Option

IMG_FILE = "Girl_with_a_Pearl_Earring.jpg" # Only Use JPG File

SHOW_IMAGE = True



#############################################################################
#############################################################################

#Import Image

img = Image.open(IMG_FILE) # Image File
mode, size = img.mode, img.size # Image Format, Size
width, height = size[0], size[1]
pix = list(img.getdata())


#Convert RGB images to Gray Scale
gray_pix = []
for i in pix:
    gray_val = round(np.mean(i))
    gray_pix.append(gray_val)


gray_pix = np.array(gray_pix)
gray_pix = gray_pix.reshape(height, width)

gray_img = Image.fromarray(gray_pix)

#Show Image
if SHOW_IMAGE :

    img.show()
    img.close()

    gray_img.show()
    gray_img.close()

 

## 결과

원본
Grayscale


 

 

## 라이브러리를 바로 사용한 코드

 

from PIL import Image
import numpy as np


#Option

IMG_FILE = "Girl_with_a_Pearl_Earring.jpg" # Only Use JPG File

SHOW_IMAGE = True



#############################################################################
#############################################################################

#Import Image

img = Image.open(IMG_FILE) # Image File
img_Gray = img.convert('L')
img_Gray.show()

사실 코드 3줄이면 Grayscale로 변환 가능하다.

댓글