import numpy as np
from PIL import Image

def naive_grayscale(numpy_image):
    numpy_image = numpy_image.astype(np.int32) # Attention à l'overflow en uint8
    return ((numpy_image[:, :, 0] + numpy_image[:, :, 1] + numpy_image[:, :, 2]) / 3.0).astype(np.uint8)

def ntsc_grayscale(numpy_image):
    return (numpy_image[:, :, 2] * 0.299 + numpy_image[:, :, 1] * 0.587 + numpy_image[:, :, 0] * 0.114).astype(np.uint8)

def red_grayscale(numpy_image):
    return numpy_image[:, :, 2].astype(np.uint8)

def green_grayscale(numpy_image):
    return numpy_image[:, :, 1].astype(np.uint8)

def blue_grayscale(numpy_image):
    return numpy_image[:, :, 0].astype(np.uint8)

# Code pour la visualisation, ne pas modifier ci-dessous
# Lecture de l'image
pil_image = Image.open('starry.jpg')
np_image = np.array(pil_image)

# Conversions en niveaux de gris
naive_gs = naive_grayscale(np_image)
ntsc_gs = ntsc_grayscale(np_image)
red_gs = red_grayscale(np_image)
green_gs = green_grayscale(np_image)
blue_gs = blue_grayscale(np_image)

# Sauvegarde de l'image
first_line = np.hstack([np_image,
                        np.repeat(naive_gs[:, :, np.newaxis], 3, axis=2),
                        np.repeat(ntsc_gs[:, :, np.newaxis], 3, axis=2)]
                       )
second_line = np.hstack([np.repeat(red_gs[:, :, np.newaxis], 3, axis=2),
                         np.repeat(green_gs[:, :, np.newaxis], 3, axis=2),
                         np.repeat(blue_gs[:, :, np.newaxis], 3, axis=2)])
results = np.vstack([first_line, second_line])

pil_image = Image.fromarray(results)
pil_image.show()