import matplotlib.pyplot as plt
import numpy as np
from imageio import imread
from skimage.color import rgb2hsv, yiq2rgb, rgb2yiq
x = 255; y = 30; gråtoner = np.array([[int(i*255/x) for i in range(x)] for j in range(y)])
mona = imread("bday.jpeg")
hsv_mona = rgb2hsv(mona)
yiq_mona = rgb2yiq(mona)
En farge er en vektor: [255] eller [0,0,255]
Opp til nå har vi hatt 1D fargerom:
Men vi går nå over i farger, som gir oss 3D fargerom:
Men akkurat som at det er vanskelig å visualisere en posisjon i 3D rom gitt som en verdi på en slider, er det vanskelig å visualisere det slik. Vi bruker derfor 3D figurer:
Akkurat som når vi bytter til frekvensdomenet er det ting som egner seg bedre, eller er mindre regnekrevende, i andre fargerom.
Feks: Kan du tenke deg å histogramutgjevne i RGB?
Default rom for de fleste informatikere. Brukes i kode fordi
RGB er ikke veldig intuitivt for mennesker. Det viser seg også at mange metoder kan gjøres bedre i andre rom.
For dere som liker matte: Dette er polarkoordinater!
Et intuitivt rom. Sliderne sier nå mer for mennesker enn ved RGB:
Formler:
$$ H = \theta \hbox{ if } B <= G \hbox{ else } 360-\theta $$$$ S = 1 - \frac{ 3 min( R G B ) }{ R+G+B } $$$$ I = \frac{ R+G+B }{ 3 } $$$$ \theta = cos^{-1} \Bigg( \frac{ \frac{1}{2} ((R-G)+(R-B)) }{ \sqrt{ (R-G)^2 + (R-B)(G-B) } } \Bigg) $$Og det finnes formler for å komme tilbake også.
s. 27 i foilene viser alt dette mer nøyaktig. Dere må bare vite at de finnes!
I og Q: Farge (kromasitet)
Y = Lyshet
Standard for TV og video i USA. Viktig for dere: Brukes i JPEG.
Luminansen kan vises alene, som på svart-hvitt TV. Gjerne scroll opp til HSI og se forskjellen mellom Intensity og Luminans!
Tilsvarende finnes for å komme tilbake, s. 33 i foilene.
Et ekte RGB-histogram vil nok være en dimensjon per farge, som betyr at kurven er i 4D rom. Vi er i stedet oppfinnsomme: Legg alle RGB oppå hverandre, eller bare bruk Intensitet eller Luminans fra HSI eller YIQ:
Bør nok ikke utføres i RGB, heller i HSI, HSV, YIQ, på intensitet / luminans. Fargene blir bevart, kontrasten blir forbedret. Men så klart, det spørs hva du vil!
Mange muligheter:
Gjøre bilder skarpere ved å legge til Laplace. Under har jeg addert LoG til originalen for et skarpere bilde.
Forskjellig effekt, eller mindre regnekrevende, i forskjellig fargerom. Her: Samme effekt for en tredjedel av jobben.
# Kode kan ignoreres
from skimage.color import yiq2rgb, rgb2yiq
from scipy.signal import convolve2d;
img = imread("Juno2.jpeg")[200:2000,200:1500,:];
img_yiq = rgb2yiq(img);
h = [[- 2, -8, -14, - 16, -14, - 8, - 2],
[- 8, -24, -24, - 16, -24, -24, - 8],
[-14, -24, 30, 80, 30, -24, -14],
[-16, -16, 80, 160, 80, -16, -16],
[-14, -24, 30, 80, 30, -24, -14],
[- 8, -24, -24, - 16, -24, -24, - 8],
[- 2, -8, -14, - 16, -14, - 8, - 2]] # LOG filter
h = np.array(h)/255; # Interessant effekt om dette ikke gjøres
img_rgb_sharp = np.zeros(img.shape)
for i in range(3):
img_rgb_sharp[:,:,i] = (img[:,:,i] + 2*convolve2d(img[:,:,i],h, mode="same"))/255 # Sharp alle kanaler
y_skarpere = convolve2d(img_yiq[:,:,0],h,mode="same"); # Sharp luminans
img_yiq[:,:,0] = img_yiq[:,:,0]+y_skarpere*2
fig = plt.figure(figsize=(20,20));
fig.add_subplot(1,3,1); plt.imshow(img_rgb_sharp); plt.title("RGB")
fig.add_subplot(1,3,2); plt.imshow(img); plt.title("Original")
fig.add_subplot(1,3,3); plt.imshow(yiq2rgb(img_yiq)); plt.title("YIQ sharpened på Y"); None
Men dere må passe på hvilket rom det gir mening å gjøre ting i!
Hvis du har et gråtonebilde, bruker du cmap="gray". Dette er et pseudofarge-bilde. Det finnes mange cmap, og felles for dem er at du bruker en LUT for å mappe en verdi til en farge:
Feks når du viser spekter:
plt.figure(figsize=(8,8)); plt.imshow(np.log(1+abs(np.fft.fftshift(np.fft.fft2(yiq_mona[:,:,0])))))
Spesielt bra hvis du vil uttrykke små nyanser i gråtone, eller små endringer, som kanskje ikke ville vært synlig for menneskeøyet til vanlig.
Det behøver ikke å være gråtone-bilder heller, det kan være ikke-synlig lys, frekvenser, vær-data.
Her er et eksempel på falske farger på et varmekamera:
Verdien "varmt" blir mappet ved en LUT til rødt, og "kaldt" mappes til lilla.