Grayscale obrázok v Pythone (numpy, matplotlib) - objasnenie colormapy

Jano7

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()


Ja

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.

bakakaika

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.

Jenda

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.

Jano7

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:



guzman

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