Algorithm/Image Processing

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

리미와감자 2022. 9. 2. 00:08
728x90
반응형

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

 

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로 변환 가능하다.

728x90
반응형