Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Jano7 27. 08. 2018, 19:13:44

Název: Grayscale obrázok v Pythone (numpy, matplotlib) - objasnenie colormapy
Přispěvatel: Jano7 27. 08. 2018, 19:13:44
V nasledujúcom kóde sa pomocou knižníc numpy a matplotlib modifikuje obrázok na čiernobiely.
Každý jeden bod obrázka sa vyjadrí trojicou čísiel RGB; z obrázka sa vytvorí matica a tá sa prenásobí váhami na vytvorenie čiernobieleho obrázku.
Nechápem však tento riadok: plt.imshow(gray_img, cmap=plt.get_cmap('gray')). Čo je vlastne tá colormapa
a prečo musím získať šedú colormapu pyplotu (jeho okna?), keď idem zobraziť obrázok? Bez toho cmap atribútu
sa mi obrázok nezobrazí čiernobielo.

Kód: [Vybrat]
#!/usr/bin/env python3

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# formula
# Y' = 0.299 R + 0.587 G + 0.114 B

def rgb2gray(rgb):

    print(rgb[...,:3].shape)
    return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])
   
img = mpimg.imread('sid.jpg')     
gray_img = rgb2gray(img)   

plt.imshow(gray_img, cmap=plt.get_cmap('gray'))
plt.show()
Název: Re:Grayscale obrázok v Pythone (numpy, matplotlib) - objasnenie colormapy
Přispěvatel: Ja 27. 08. 2018, 20:12:48
Mám dojem, že tou transformací přes numpy převádíš obrázek reprezentovaný v každém bodě třemi čísly (červená, zelená, modrá) na pole kde každému bodu odpovídá jedno číslo - úroveň jasu spočítaná vynásobením a sečtením podle vzorce nahoře. Colormapa pak říká, jaké úrovni jasu odpovídá interpretace v obrázku - nejspíš opět rgb, až na to, že tentokrát v odstínech šedi - čili všechny tři složky mají stejnou hodnotu.
Název: Re:Grayscale obrázok v Pythone (numpy, matplotlib) - objasnenie colormapy
Přispěvatel: bakakaika 27. 08. 2018, 20:40:41
Mám dojem, že tou transformací přes numpy převádíš obrázek reprezentovaný v každém bodě třemi čísly (červená, zelená, modrá) na pole kde každému bodu odpovídá jedno číslo - úroveň jasu spočítaná vynásobením a sečtením podle vzorce nahoře. Colormapa pak říká, jaké úrovni jasu odpovídá interpretace v obrázku - nejspíš opět rgb, až na to, že tentokrát v odstínech šedi - čili všechny tři složky mají stejnou hodnotu.

Přesně tak, gray_img je matice X krát X ziskana uvedenou transformaci. plt.imshow to ji plotuje podle nejakeho gradientu, defaultni je takovy zelenožlutý a tohle jenom říká že to má být stupních šedi. Obecně to může být z libovolného barevného přechodu.
Název: Re:Grayscale obrázok v Pythone (numpy, matplotlib) - objasnenie colormapy
Přispěvatel: Jenda 27. 08. 2018, 23:26:29
a prečo musím získať šedú colormapu pyplotu (jeho okna?), keď idem zobraziť obrázok? Bez toho cmap atribútu sa mi obrázok nezobrazí čiernobielo

Protože lidé typicky tímto způsobem nezobrazují „reálné“ obrázky, ale třeba nějaké 2D funkce nebo různá data. A u těch je barevná paleta, která jde „přes duhu“, vhodnější, protože člověk dokáže odlišit víc úrovní a přesněji je porovnat.
(https://jenda.hrach.eu/web/kukuruku.png)
Název: Re:Grayscale obrázok v Pythone (numpy, matplotlib) - objasnenie colormapy
Přispěvatel: Jano7 28. 08. 2018, 12:34:18
OK, diq, už mi je to jasnejšie; čiže sa tým atribútom vypína to farebné tweakovanie matplotlib knižnice.

Obrázok s default matplotlib colormapou vyzeral takto:

(https://i.imgur.com/43sGRdy.jpg)
Název: Re:Grayscale obrázok v Pythone (numpy, matplotlib) - objasnenie colormapy
Přispěvatel: guzman 31. 08. 2018, 14:00:48
Ahoj, je to sposobene tym ze ukladas vo formate jpg. Tento format je stratovy a moze sposobit stratu farby, ak chces ukladat obrazok vo farbe pouzi prosim format *.bmp alebo *.pcx