import numpy as np from PIL import Image # načtení obrázku pomocí knihovny Pillow img = Image.open('../kvetina.jpg') # převod dat obrázku do podoby vhodné pro Numpy data = np.asarray(img) # přenásobení koeficienty vah jednotlivých barev # ~ díky broadcastingu tohle opravdu funguje, protože: # ~ "data" je 3D-pole (výška, šířka, 3) # ~ přepočítávací vektor je (1, 3) grayscale = data * np.array([0.299, 0.587, 0.114]) # různé způsoby, jak se dobrat stejného výsledku negativ_1 = grayscale[:, :, 0] + grayscale[:, :, 1] + grayscale[:, :, 2] negativ_2 = grayscale[..., 0] + grayscale[..., 1] + grayscale[..., 2] negativ_3 = grayscale.sum(axis=2) # A) jelikož (0.299 + 0.587 + 0.114 = 1), tak po násobení a součtu výsledné číslo stále bude spadat do 8-bitového rozsahu (tj. mezi 0 a 255) # B) ale díky násobení celého čísla (světlosti barev) reálnými koeficienty obsahují matice "negativ_N" reálná čísla, takže obrázek z nich přímo udělat nejde a musíme je nejdříve převést na celočíselné negativ_1 = negativ_1.astype(dtype=np.uint8) negativ_2 = negativ_2.astype(dtype=np.uint8) negativ_3 = negativ_3.astype(dtype=np.uint8) # uložení vypočítaného nového obrázku na disk # ~ překvapivě funkce sum() si s tím sama poradí Image.fromarray(negativ_1, 'L').save('grayscale_1.jpg') Image.fromarray(negativ_2, 'L').save('grayscale_2.jpg') Image.fromarray(negativ_3, 'L').save('grayscale_3.jpg')