Dopo semplice immagine decimazione utilizzando: img_decim_arr = img_arr[::2,::2]
, ho ottenuto istogramma molto simile all'originale istogramma:
Decimazione utilizzando: skimage.measure.block_reduce(img_arr, block_size = (2,2), func=np.mean)
(2x2 blocco media), che è il metodo consigliato per sottocampionamento (trovato su StackOverflow in alcune discussioni) produce un istogramma molto caratteristico:
Ogni secondo è più grande. Non sono sicuro che questo sia dovuto ad un effetto di aliasing. Qualcuno può spiegare e dare alcuni suggerimenti teorici su come il sottocampionamento influisce sull'istogramma dell'immagine (segnale 2D)?istogramma insolito dopo immagine decimazione
5
A
risposta
1
Il problema è la funzione np.mean
, perché non arrotonda agli interi e restituisce i float.
import numpy as np
import skimage.measure
a = (10 * np.random.randn(10,10) + 127).astype(np.uint8)
a
Out[4]:
array([[121, 124, 139, 129, 130, 114, 127, 96, 114, 135],
[127, 132, 102, 142, 119, 107, 138, 130, 141, 132],
[113, 132, 132, 118, 121, 120, 142, 115, 124, 128],
[127, 121, 129, 129, 121, 119, 126, 113, 128, 116],
[144, 131, 123, 131, 130, 137, 140, 142, 127, 128],
[127, 126, 124, 115, 127, 125, 122, 126, 147, 132],
[118, 119, 117, 117, 133, 149, 122, 120, 116, 138],
[147, 147, 127, 117, 123, 123, 136, 121, 139, 129],
[142, 129, 113, 111, 130, 116, 137, 127, 106, 148],
[132, 141, 141, 142, 119, 132, 126, 115, 131, 122]], dtype=uint8)
b = skimage.measure.block_reduce(a, block_size = (2,2), func=np.mean)
b
Out[6]:
array([[ 126. , 128. , 117.5 , 122.75, 130.5 ],
[ 123.25, 127. , 120.25, 124. , 124. ],
[ 132. , 123.25, 129.75, 132.5 , 133.5 ],
[ 132.75, 119.5 , 132. , 124.75, 130.5 ],
[ 136. , 126.75, 124.25, 126.25, 126.75]])
che potrebbe dare interessanti effetti collaterali nella vostra logica. Si avvita definitivamente con la funzione dell'istogramma matplotlib, perché avere galleggianti fa pensare in modo diverso a come posizionare i bordi del cestino.
Check this out:
a = (10 * np.random.randn(200,200) + 127).astype(np.uint8)
b = skimage.measure.block_reduce(a, block_size = (2,2), func=np.mean)
hist(b.ravel(), bins=255)
I bit bianchi sono in realtà zero nella matrice che le hist
restituisce la funzione. Diventa ancora peggio se si forza l'arrotondamento nel mio esempio giocattolo:
hist(b.ravel().astype(np.uint8), bins=255)
Dandogli i bidoni e la gamma risolve il problema. Anche se si ingrandisce vicino
hist(b.ravel().astype(np.uint8), bins=255, range=(0,255))
È la discreta dati tracciati? È possibile ottenere effetti visivi sgradevoli quando si scelgono i raccoglitori troppo piccoli per i dati discreti. Vorrei provare a cambiare il numero di contenitori e vedere se questo rimuove questo effetto. – cel
Sì, lo spazio colore dell'immagine a 8 bit in scala di grigi, quindi il numero di contenitori è 256, uno per ciascuna intensità. – MarcinBurz