import numpy as np
from PIL import Image
import copy

def grayscale_contrast(numpy_image):
    numpy_image = numpy_image.astype(np.int32)
    min_value = np.min(numpy_image)
    max_value = np.max(numpy_image)
    return (((numpy_image - min_value) / (max_value - min_value)) * 255).astype(np.uint8)

def color_contrast(numpy_image):
    numpy_image = numpy_image.astype(np.int32)
    for rgb in [0, 1, 2]:
        min_value = np.min(numpy_image[:, :, rgb])
        max_value = np.max(numpy_image[:, :, rgb])
        numpy_image[:, :, rgb] = (
                    ((numpy_image[:, :, rgb] - min_value) / (max_value - min_value)) * 255)
    return numpy_image.astype(np.uint8)


pil_grayscale_image = Image.open('bridge.png').convert('L')
pil_color_image = Image.open('tree.jpg')

np_grayscale_image = np.array(pil_grayscale_image)
np_color_image = np.array(pil_color_image)
np_color_image2 = copy.deepcopy(np_color_image)


grayscale_contrasted = grayscale_contrast(np_grayscale_image)
color_contrasted = color_contrast(np_color_image)
color_graycontrasted = grayscale_contrast(np_color_image2)


first_line = np.hstack((np.repeat(np_grayscale_image[:, :, np.newaxis], 3, axis=2), np_color_image, np_color_image2))
second_line = np.hstack((np.repeat(grayscale_contrasted[:, :, np.newaxis], 3, axis=2), color_contrasted, color_graycontrasted))
results = np.vstack([first_line, second_line])
results = Image.fromarray(results)
results = results.resize((results.width//2, results.height//2))
results.show()