|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: May 2012
Messaggi: 8
|
trattamento delle immagini, domanda naive
ciao a tutti ragazzi!
ho a che fare con alcune foto sciupate da rumore. Qualcosa di analogo a : ![]() Una soluzione banale al rumore è quella di una media del colore pixel per pixel su di una cornice dello stesso. Conosco benino il C e il fortran, un po' meno il python, che ho usato precedentemente per applicazioni scientifiche. Un'idea di questo tipo è molto vicina al mio 'comprendere' la programmazione. Per intenderci, se invece che una fotografia NxM pixel avessi una matrice NxM e dovessi mediare ogni valore con gli adiacenti saprei immediatamente dove mettere mano. Adesso la domanda: qualcuno sa darmi un'idea del come e se sia possibile trattare problemi di questo tipo (che so essere tra l'altro molto comuni nel trattamento di immagini astronomiche) con i mezzi a mia disposizione? La questione mi incuriosisce ed in un futuro qualche conoscenza a riguardo potrebbe tornare utile, sarei disposto anche a studiare qualche dispensa di interesse. a presto, ciao! Ultima modifica di peppedilillo : 12-10-2012 alle 18:44. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2002
Città: Cagliari
Messaggi: 13495
|
Non ho mai programmato filtri per immagini, ma correggere del rumore da una sola foto è teoricamente impossibile.
Secondo me è più da sezione grafica... ma magari mi sbaglio. L'unico modo per attenuare realmente il rumore, è avere più foto dello stesso identico soggetto, siccome il rumore non è fisso mentre il soggetto si (ovvio se parliamo di una foto mossa tipo un albero con vento, o evento sportivo la cosa risulta molto difficile), con una serie di calcoli si può sottrarre il rumore dall'immagine pulita. Ma togliere il rumore da una foto, è praticamente impossibile, si può attenuare un po' con un filtro particolare di sfocatura magari con un algoritmo particolare di riconoscimento del rumore (con il pericolo che il riconoscimento fallisca e rimuova parti dell'immagine reale), ma perdi dettagli, non è una rimozione è un "cammuffamento". Di più non so andare, ma questi sono i principi teorici che conosco; gli algoritmi non saprei farli ![]()
__________________
MoBo:Asus Prime x470-Pro*CPU:AMD Ryzen 5700x*RAM:Kingston FURY KF432C16RB2K2/16*Sk.Vid:Asus DUAL-RX580-O8G*Ali:Enermax Revolution87+ 550W*Storage:Samsung 970 Evo Plus 1TB + Samsung 860 Evo 1TB*Mons:Dell 2209WAf + LG 24EA53VQ |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Per il miglioramento dell'immagine in questione hai diverse opzioni. Probabilmente ti conviene provarne piu' di una, per vedere la differenza nei risultati.
Il mio consiglio e': - filtro lineare (i.e. convoluzione) - filtro non lineare (i.e. mediana) - trasformata bidimensionale di Fourier; Riguardo la convoluzione: si tratta di sostituire un pixel (i.e. un valore della matrice rappresentante l'immagine) con un valore calcolato mediante l'applicazione di una matrice, per esempio 3X3 intorno al punto in questione. Per esempio, puoi applicare la matrice 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 ad ogni punto dell'immagine. Al punto (x,y) verra' sostituito il valore 1/9f(x-1,y-1) + 1/9(x,y-1) + ..... (Beh, per questa particolare matrice il risultato equivale alla sostituzione del valore di intensita' del punto con la media dei suoi vicini, incluso se stesso). Puoi anche incrementare la matrice a 5x5, 7x7,... Il risultato e' "cosmetico": l'immagine migliora parecchio ma all'aumentare della matrice cresce la sensazione di sfocatura. - filtro non lineare (i.e. mediana). Costruisci una nuova immagine mettendo alle coordinate (x,y) il punto ottenuto come mediana dei 9 punti (i.e. il punto (x,y) e i suoi 8 vicini). In pratica, prendi i 9 punti, li ordini, prendi la mediana e la metti nella nuova immagine alle coordinate (x,y). Il risultato e' che i vari punti che "sparano" vengono cancellati. - Trasformata di fourier bidimensionale. applichi la trasformata e otterrai due "immagini": quella delle fasi e quello dei moduli (spettro). Plottando lo spettro otterrai un'immagine simmetrica rispetto al centro. Ovviamente questa immagine rappresenta le frequenze presenti nell'immagini. Quelle basse ti danno le forme delle immagini e si concentrano al centro, quelle alte ti danno i dettagli e vanno verso la periferia. Il rumore che vedi sull'immagine e' ad alta frequenza, quindi ti bastera' disegnare un contorno nero per filtrarlo. Ovviamente piu' filtri, piu' l'immagine inizialmente perdera' il rumore ma perdera' progressivamente anche i dettagli. Questa tecnica e' molto usata nella compressione delle immagini. Ah! Dimenticavo. Le immagini sono quasi sempre in formato RGB che mal si presta a queste techiche (applicarle ad un singolo canale produce risultati disastrosi). Conviene applicare una conversione verso un altro formato, per esempio HSL. Le conversioni sono formulette standard che si trovano in rete. Parere personale: usa OpenCv. Fa gia' tutto ed in maniera molto ottimizzata Quote:
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#4 |
Junior Member
Iscritto dal: May 2012
Messaggi: 8
|
Grazie mille ragazzi!
@sottovento: grazie ancora per le belle soluzioni ma avrei bisogno di qualche informazione/riferimento preliminare ![]() Come 'aprire' un file immagine in (per esempio) C? Come trattare con i pixel-valori? |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 309
|
il rumore presente nell'immagine mi sembra di tipo sale e pepe e di solito per rimuovere rumori di questo tipo si usano filtri mediani
dato che il filtro mediano 2D ha il problema che maltratta i corner, di solito si applicano filtri 1D per righe e poi per colonne (o viceversa, che dà un risultato diverso numericamente, ma simile per l'occhio umano) programmare una cosa del genere, dato che devi filtrare per righe e per colonne, è abbastanza semplice anche in un linguaggio di basso livello tipo C (oppure se non vuoi perdere troppo tempo, matlab si presta molto) devi avere solo: - una routine per il sorting (usa una funzione quicksort che trovi in rete) - una routine per il calcolo della mediana (che chiama al suo interno il quicksort) i bordi sono un problema, perchè quando arrivi vicino al bordo dell'immagine o accorci la lunghezza del filtro (e i bordi rimangono meno filtrati) oppure prolungi i valori dei bordi anche oltre (però se l'ultimo campione è sbagliato il bordo viene filtrato male) non mi dilungo oltre, per approfondire cerca rumore sale e pepe (salt and pepper noise, in inglese) e filtro mediano (median filter) e troverai un sacco di informazioni a riguardo comunque anche il filtro mediano, per immagini così corrotte, non fa i miracoli |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Nella libreria standard di Java hai gia' i metodi che ti servono, sono in ImageIO. Una volta caricata l'immagine, hai la possibilita' di vederla come matrice, su cui applicare le operazioni in questione
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#7 |
Junior Member
Iscritto dal: May 2012
Messaggi: 8
|
Grazie vi farò sapere i risultati!
Peppe |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:07.