import cv2
from PIL import Image 
import numpy as np

#Wyświetlanie grafiki
def show_image(img):
    cv2.imshow("image", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#Wczytanie grafiki z pliku
def read_image_cv(path):
    img = cv2.imread(path, cv2.IMREAD_COLOR)
    print(img)
    print(img.shape)
    print(type(img))
    show_image(img)
    return img

'''
#Wczytywanie obrazów za pomocą biblioteki Pillow
def read_image_PIL(path):
    im = Image.open("image.jpg")
    try:
        print(im)
    except:
        print(type(im))
    im.show()
    return im
read_image_PIL("image.jpg")
'''

image = read_image_cv("image.jpg")

def reverse_image(img):
    new_img = []
    for row in range(img.shape[0]):
        new_row = []
        for column in range(img.shape[1]):
            new_row.append(img[-1-row][column])
        new_img.append(new_row)
    return np.array(new_img)
show_image(reverse_image(image))


def reverse_image_short(img):
    img_reverse = img[::-1]
    return img_reverse
show_image(reverse_image_short(image))

show_image(cv2.flip(image, 0) )


def gray_scale(img):
    for row in range(img.shape[0]):
        for column in range(img.shape[1]):
            gray = int(sum(img[row][column])/3)
            img[row][column][0] = gray
            img[row][column][1] = gray
            img[row][column][2] = gray
    return np.array(img)

show_image(gray_scale(image) )

show_image(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) )


def sepia(img):
    for row in range(img.shape[0]):
        for column in range(img.shape[1]):
            B = img[row][column][0]
            G = img[row][column][1]
            R = img[row][column][2]
            img[row][column][2] =  min(255, (0.393*R + 0.769*G + 0.189*B))
            img[row][column][1] =  min(255, (0.349*R + 0.686*G + 0.168*B))
            img[row][column][0] =  min(255, (0.272*R + 0.534*G + 0.131*B))
    return np.array(img, dtype= np.uint8)

show_image(sepia(image))


def change_colors(img,R_scale,G_scale,B_scale):
    for row in range(img.shape[0]):
        for column in range(img.shape[1]):
            img[row][column][2] =  img[row][column][2] * R_scale
            img[row][column][1] =  img[row][column][1] * G_scale
            img[row][column][0] =  img[row][column][0] * B_scale
    return np.array(img, dtype= np.uint8)

#show_image(change_colors(image,1.4,0,0))

def tresholding(img,treshold):
    for row in range(img.shape[0]):
        for column in range(img.shape[1]):
            gray = int(sum(img[row][column])/3)
            if gray <= treshold:
                img[row][column] = [255,255,255]
            else:
                img[row][column] = [0,0,0]
    return np.array(img)
show_image(tresholding(image,200))

