[MatLab] Ricavare istogramma desiderato da un immagine
Buona sera,
per una data immagine, dovrei ricavarne un istogramma su tutti i 255 livelli di grigio in cui il livello minimo stia a 0, quello massimo a 255 e che tra minimo e massimo il tutto sia scalato linearmente ovvero l'istogramma finale dovrà essere simile al seguente:

Spero che qualcuno possa aiutarmi.
per una data immagine, dovrei ricavarne un istogramma su tutti i 255 livelli di grigio in cui il livello minimo stia a 0, quello massimo a 255 e che tra minimo e massimo il tutto sia scalato linearmente ovvero l'istogramma finale dovrà essere simile al seguente:

Spero che qualcuno possa aiutarmi.
Risposte
Che difficoltà incontri?
"apatriarca":
Che difficoltà incontri?
Non so come procedere, lei come farebbe?
Esiste la funzione histogram che ti permette di fare tutto in modo automatico (ma che suppongo tu non possa usare?). In tal caso si tratta di fare un ciclo su tutti i pixel e contare le occorrenze in un array di 256 elementi. A quel punto devi fare semplicemente il grafico di tale array.
"apatriarca":
Esiste la funzione histogram che ti permette di fare tutto in modo automatico (ma che suppongo tu non possa usare?). In tal caso si tratta di fare un ciclo su tutti i pixel e contare le occorrenze in un array di 256 elementi. A quel punto devi fare semplicemente il grafico di tale array.
Grazie, si, posso usare anche la funzione histogram ma non ho capito il suo suggerimento.
L'obiettivo finale è quello di rendere più scura un immagine che all'inizio si presenta con questo istogramma

Finora, da vari aiuti in rete, sono riuscita ad ottenere un immagine il cui istogramma ha il massimo dell’immagine a 255 e il minimo dell’immagine a 0, non so però come scalare il tutto linearmente tra il minimo e il massimo

Lei per rendere un immagine più scura con matalb cosa farebbe? Io ho già usato il comando imadjust(Im, stretchlim(Im), []) ed eseguito l'equalizzazione ma senza nessun risultato accettabile.
Scusa ma non avevo capito che cosa volevi esattamente ottenere. E ancora adesso ho in effetti diversi dubbi. Parli di rendere una immagine più scura, ma poi vuoi scalare il minimo e il massimo tra 0 e 255 (operazione che ha effetto sul contrasto). Se vuoi effettivamente scurire una immagine i metodi più semplici sono quelli di sottrarre un qualche valore a tutti i pixel dell'immagine oppure moltiplicare tutti i pixel per qualche valore minore di uno. Esistono poi operazioni ancora più evolute, ma non essendomi del tutto chiaro il tuo obiettivo mi limito a queste.
"apatriarca":
Scusa ma non avevo capito che cosa volevi esattamente ottenere. E ancora adesso ho in effetti diversi dubbi. Parli di rendere una immagine più scura, ma poi vuoi scalare il minimo e il massimo tra 0 e 255 (operazione che ha effetto sul contrasto). Se vuoi effettivamente scurire una immagine i metodi più semplici sono quelli di sottrarre un qualche valore a tutti i pixel dell'immagine oppure moltiplicare tutti i pixel per qualche valore minore di uno. Esistono poi operazioni ancora più evolute, ma non essendomi del tutto chiaro il tuo obiettivo mi limito a queste.
In effetti anche io sto andando a tentativi per capire come procedere.
Se la traccia fosse questa:
data un immagine chiara renderla più scura, lei quale istruzioni di preciso userebbe?
Come si fa a sottrarre un qualche valore a tutti i pixel dell'immagine oppure moltiplicare tutti i pixel per qualche valore minore di uno?
Mi è stato suggerito di leggere il testo "Digital Image processing" di Woods e Gonzales, lo conosce? Ha qualche fonte in italiano per capire in che modo scurire un immagine con istruzioni matlab?
Grazie dell'aiuto, sto leggendo molta teoria ma ho ancora le idee confuse soprattutto su quali istruzioni usare.
Una immagine è semplicemente una matrice di pixel. Nel caso di una immagine in scala di grigi si tratta insomma semplicemente di una matrice in cui ogni elemento ha un valore da 0 a 255 (o da 0 a 1 - non ricordo come legge le immagini MATLAB). In ogni caso è sufficiente usare le usuali operazioni per le matrici. Quindi imageScaled = image .* 0.7 moltiplicherà ogni pixel per quel valore.
"apatriarca":
Una immagine è semplicemente una matrice di pixel. Nel caso di una immagine in scala di grigi si tratta insomma semplicemente di una matrice in cui ogni elemento ha un valore da 0 a 255 (o da 0 a 1 - non ricordo come legge le immagini MATLAB). In ogni caso è sufficiente usare le usuali operazioni per le matrici. Quindi imageScaled = image .* 0.7 moltiplicherà ogni pixel per quel valore.
Ho appena provato ma non ottengo il risultato desiderato, la mia immagine di partenza è tipo questa

che ha il seguente istogramma

ed io voglio ottenere alla fine che diventi tipo questa

con istogramma seguente

Come fare? Questo è il mio problema.
Grazie dell'aiuto.
A prima vista è il risultato di qualcosa tipo image.^x per qualche valore di x. Nota che l'operazione richiede valori dell'immagine in 0-1..
"apatriarca":
A prima vista è il risultato di qualcosa tipo image.^x per qualche valore di x. Nota che l'operazione richiede valori dell'immagine in 0-1..
Con questo codice

l'immagine è tutta bianca, mah

Come ti ho detto i valori devono essere in [0, 1] e non [0, 255] come nel tuo caso.. Non è sufficiente convertire in double, i valori saranno infatti anche in questo caso da 0 a 255. Devi quindi dividere per 255 prima di fare una correzione di gamma.
"apatriarca":
Come ti ho detto i valori devono essere in [0, 1] e non [0, 255] come nel tuo caso.. Non è sufficiente convertire in double, i valori saranno infatti anche in questo caso da 0 a 255. Devi quindi dividere per 255 prima di fare una correzione di gamma.
Grazie ma per favore quali sono le istruzione esatte? Non ho ben capito come eseguire la divisione per 255 prima della correzione gamma.
(image./255).^3