Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237

    [VB.NET] Effetto Threshold su immagini sfocate

    Ciao Ragazzi.
    Ho un problema, da risolvere e vi chiedo aiuto
    Mi è stato chiesto di scrivere un programma che a partire da immagini tipo questa:
    http://s24.postimg.org/uvusapij9/fotocolori.jpg
    elabori l'immagine in modo da ottenerne una finale formata da 2 colori: in nero le macchie e in bianco lo sfondo.
    Se vi state chiedendo che cavolo di immagini sono, quella foto è un ingrandimento 300x della pelle attorno all'unghia e le macchie sono capillari.
    Fin'ora ho fatto questo:
    http://s14.postimg.org/9qzg4so0x/prova1.png
    e poi questo:
    http://s16.postimg.org/lrjdl3kdx/highcontrast.png
    Ma non sono ancora soddisfatto del risultato..
    Nel frattempo mi sono letto e ho provato vari algoritmi di edge detection, sobel, canny ecc ecc..
    Il problema è che il colore di sfondo non è uniforme ma varia all'interno dell'immagine, sennò basterebbe un threshold secco...
    E poi, come vedete le foto sono molto sporche, e i contorni delle macchie poco definiti..
    Che tipo di elaborazione necessitano le foto, per migliorare di "qualità?"
    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Ragazzi.. nessuno ha qualche idea?
    Non chiedo certo del codice già bello e pronto.. ma una dritta, qualche consiglio.. voi come fareste per ridurre il noise dell'immagine? Non so più dove sbattere la testa...

  3. #3
    Ho avuto a che fare con cose di questo genere, non è un lavoro semplice e da quanto ho visto è difficile trovare una soluzione che funzioni sempre in assenza di un background ben definito. il mio consiglio è provare a lavorare sulle tue immagini di prova con un editor di immagini (ad esempio GIMP) finché non trovi una serie di passaggi "standard" che ti forniscano in maniera abbastanza consistente un output che trovi soddisfacente, e quindi riproduci via codice i passaggi in questione.

    Nel tuo caso, ad esempio, un buon filtro da provare è la cosiddetta "differenza di gaussiane", con un po' di smanettamento sul GIMP (differenza di gaussiane, desaturazione, luminosità+contrasto) ottengo:

    Un passaggio successivo implementabile nel tuo codice potrebbe essere la rimozione di oggetti più piccoli di un tot.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Ciao.
    Intanto grazie per la risposta.
    Si, è un po quello che sto già facendo, usando questo programma http://www.aforgenet.com/projects/iplab/
    e le sue relative librerie. Il problema dell'immagine è che è tutta sfuocata e il colore di sfondo non è del tutto omogeneo ma cambia da sinistra verso destra..
    Gimp lo conosco di nome, dici che ha altri filtri che potrebbero essermi utili?

  5. #5
    Originariamente inviato da renygade
    Il problema dell'immagine è che è tutta sfuocata e il colore di sfondo non è del tutto omogeneo ma cambia da sinistra verso destra..
    E infatti per quello non puoi procedere fin da subito con un approccio globale, ma devi in qualche modo eliminare il fondo. Un modo, ad esempio, è duplicare l'immagine, procedere ad un blur gaussiano ad ampio raggio

    fare la differenza tra l'immagine originale e la copia blurrata

    e quindi regolare il contrasto.

    Gimp lo conosco di nome, dici che ha altri filtri che potrebbero essermi utili?
    Non saprei, io ho usato quasi sempre quello perché ha una discreta quantità di filtri e già lo uso per il fotoritocco.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Grandioso!!!!
    Ma la prima immagine che hai postato è quella originale?
    Spe che provo.. Ma mi spieghi a cosa serve l'effetto blur di preciso? Da quello che so, sembra "sfuocare" maggiormento l'immagine... può essere?
    Se quello che hai ottenuto con le tue immagini l'hai fatto con GIMP, scarico subito il programma!

  7. #7
    Originariamente inviato da renygade
    Ma la prima immagine che hai postato è quella originale?
    È l'originale dopo aver applicato un blur gaussiano con raggio 150.
    Spe che provo.. Ma mi spieghi a cosa serve l'effetto blur di preciso? Da quello che so, sembra "sfuocare" maggiormento l'immagine... può essere?
    Esattamente. L'idea è che se le cose che vuoi fare emergere sono dei "puntini" su uno sfondo sfocato ma non perfettamente uniforme, un buon modo è di sfocare completamente l'immagine (in modo da far sparire i tuoi puntini ma non alterare in maniera significativa il background), e quindi fare la differenza tra l'immagine originale e questa immagine sfocata. L'unica differenza significativa sarà quindi nei puntini (che nell'immagine sfocata sono spariti), che quindi emergono nell'immagine-differenza.
    Se quello che hai ottenuto con le tue immagini l'hai fatto con GIMP, scarico subito il programma!
    Sì, fatto con GIMP; apri l'immagine, duplica il livello, quindi, sul livello superiore, sfocatura gaussiana con raggio 150, imposta la modalità di combinazione del livello a "differenza", poi fondi i livelli. A questo punto agisci su luminosità e contrasto.
    Sono tutte operazioni che poi puoi fare in software in maniera estremamente semplice.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Ok, intanto grazie ancora per la spiegazione.
    Ho scaricato GIMP (è molto carino) e seguendo i tuoi consigli ho fatto un po' di prove e direi che sono sulla buona strada.
    Ecco un esempio di quello che sono riuscito a fare:

    In questo caso ho fatto come suggerisci tu: duplicato l'immagine, filtro gaussiano a 200 px e fusione per differenza. In più ho usato l'edge detector sobel che ha messo lo sfondo in trasparenza e sovrapponendo l'immagine originale si vede dove ha catturato le macchie... Ci sono ancora un po' pixel sparsi e le aree evidenziate sono "del bordo", non della macchia in se.. a me servirebbe catturare quello che sta dentro il bordo e poi il gioco è fatto... CI sono trucchetti o filtri per questo?
    Altra domanda: si può sfruttare GIMP da vb.net? Perché l'altro programma che usavo si, nel senso che referenziavo le librerie e mi creavo i miei filtri come oggetti. Ma AForge è scritto in C#, quindi è fatto apposta... GIMP?

  9. #9
    Originariamente inviato da renygade
    Ci sono ancora un po' pixel sparsi e le aree evidenziate sono "del bordo", non della macchia in se.. a me servirebbe catturare quello che sta dentro il bordo e poi il gioco è fatto... CI sono trucchetti o filtri per questo?
    Se riesci ad evitare il sobel (=la differenza+contrasto+soglia dà già un buon risultato) dovresti avere già le aree "piene" marcate sull'immagine, altrimenti devi usare un qualche algoritmo di segmentazione dell'immagine (l'idea è quella di un floodfill in ogni macchia con un indice diverso). Personalmente, tenterei di lavorare per il momento senza sobel, e per rimuovere i pixel spurii userei il classico giochino erodi di x, dilata di 2x e ri-erodi di x (in modo da eliminare le macchie più piccole di x, rimuovere i buchi più piccoli di x e far infine tornare i contorni delle macchie alle dimensioni originali).
    Altra domanda: si può sfruttare GIMP da vb.net? Perché l'altro programma che usavo si, nel senso che referenziavo le librerie e mi creavo i miei filtri come oggetti. Ma AForge è scritto in C#, quindi è fatto apposta... GIMP?
    Non credo sia semplice usare GIMP da .NET, ma quelli che stai usando sono filtri/operazioni molto standard, che troverai sicuramente in più librerie .NET.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Bene, ci sono quasi.
    Originariamente inviato da MItaly
    Se riesci ad evitare il sobel (=la differenza+contrasto+soglia dà già un buon risultato)
    Si infatti.. buonissimo risultato!!!
    dovresti avere già le aree "piene" marcate sull'immagine, altrimenti devi usare un qualche algoritmo di segmentazione dell'immagine (l'idea è quella di un floodfill in ogni macchia con un indice diverso).
    Non ho capito...
    Personalmente, tenterei di lavorare per il momento senza sobel, e per rimuovere i pixel spurii userei il classico giochino erodi di x, dilata di 2x e ri-erodi di x (in modo da eliminare le macchie più piccole di x, rimuovere i buchi più piccoli di x e far infine tornare i contorni delle macchie alle dimensioni originali).
    Si, infatti.. seguendo il tuo aiuto ho fatto questo:

    Direi che ci sono. Le macchie bianche sono abbastanza ben definite e sono esattamente sopra le macchie scure che devo individuare. In ogni caso, il mio intento è di fare un programma che conta le macchie rosse ma non esula dal controllo umano.. Anche perché in diverse immagini ho notato che ci sono degli aloni di luce che bisognerebbe far sparire o cmq non "conteggiare". Al limite poi vediamo come risolvere quello...
    Non credo sia semplice usare GIMP da .NET, ma quelli che stai usando sono filtri/operazioni molto standard, che troverai sicuramente in più librerie .NET.
    Si, alla fine le operazioni che faccio sono: aumenta soglia BN, duplica, blur a 200px, differenza col duplicato, saturazione "luminescenza", inverti... Il problema è il soglia, che bisogna impostarlo manualmente, individuando il valore "ottimane".. Come si potrebbe ovviare?
    Per le librerie, dove dovrei cercare?
    Comunque MItaly ti ringrazio, sei stato davvero gentilissimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.