Come posso rimuovere le ombre da un'immagine?


17

Ho questa immagine

inserisci qui la descrizione dell'immagine

Vorrei rimuovere l'ombra dall'immagine. Conosco molti metodi diversi come alcune operazioni morfologiche per rimuovere le ombre:

Ho creato questa maschera per la stessa immagine

inserisci qui la descrizione dell'immagine

Ci sono altri metodi che potrei provare a usare questa maschera che ho creato?

MODIFICA :

immagine di input e maschera delle stesse dimensioni richieste:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

EDIT 2: ho generato un'immagine invariante 1D ma non è perfetta

  I = imread('shadow.jpg');
       J = im2double(I);

      R = J(:,:,1);
      G = J(:,:,2);
      B = J(:,:,3);

     [len,wid] = size(R);

     % Generation of 2-D Log Chromaticity Image.
     for i = 1:len
        for j = 1:wid
           if ((R(i,j)*G(i,j)*B(i,j))~= 0)
              c1(i,j) = R(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c2(i,j) = G(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
              c3(i,j) = B(i,j)/((R(i,j)*G(i,j)*B(i,j))^(1/3));
           else
              c1(i,j) = 1;
              c2(i,j) = 1;
              c3(i,j) = 1;
        end
    end
end

rho1 = mat2gray(log(c1));
rho2 = mat2gray(log(c2));
rho3 = mat2gray(log(c3));

X1 = mat2gray(rho1*1/(sqrt(2)) - rho2*1/(sqrt(2)));                                         %(1/sqrt(2); -1/sqrt(2); 0)
X2 = mat2gray(rho1*1/(sqrt(6)) + rho2*1/(sqrt(6)) - rho3*2/(sqrt(6)));   %(1/sqrt(6); 1/sqrt(6); -2/sqrt(6))

theta = 120;

InvariantImage = cos(theta*pi/180)*X1 + sin(theta*pi/180)*X2;
imagesc(InvariantImage); colormap(gray)

inserisci qui la descrizione dell'immagine

Non riesci a capire cosa sto facendo di sbagliato qui per favore aiutatemi?


Buona domanda! Hai provato ad aumentare la luminosità nella regione mascherata?
Dima,

5
Controlla la mia risposta qui: dsp.stackexchange.com/questions/454/…
datageist

In termini semplici, la riflettività delle due diverse superfici è diversa, sia in termini assoluti sia come riflettono la luce diretta contro quella indiretta. Quindi rispondono in modo diverso dall'essere in ombra e hanno bisogno di formule diverse per cancellare l'ombra.
Daniel R Hicks,

Esistono altri metodi come il rilevamento dei bordi utilizzando la seconda derivata, utilizzando il gradiente e l'operatore Laplaciano.

Risposte:


11

Ci sono dozzine di pubblicazioni che si occupano del rilevamento delle ombre, che generano maschere d'ombra e in effetti alcune che rimuovono effettivamente le ombre, come quelle menzionate nei post precedenti. Potrei aggiungerne un po 'all'elenco, se necessario. Il problema, tuttavia, è IMHO lungi dall'essere risolto. Per un rapido avvio, data una maschera d'ombra, suggerisco (e ho provato in passato) i due seguenti approcci. Riducono sicuramente le ombre - ma non sempre senza soluzione di continuità, e sono sicuro che ci sono pubblicazioni (non da me) che si occupano della rimozione dell'ombra in modi simili.

  • Tecniche di manipolazione del dominio del gradiente descritte qui (Codici C e Matlab forniti): http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html L'approccio all'integrazione del gradiente può essere utilizzato per una serie di elaborazioni di immagini problemi, vedere le diapositive / presentazioni per ulteriori esempi.

    L'idea generale:

    1. Calcola le derivate spaziali (immagini sfumate) per tutti i canali di colore.
    2. Usa i confini dell'ombra dalla maschera d'ombra per generare una maschera di peso che è vicina allo zero sui confini dell'ombra e aumenta a uno all'interno di un determinato quartiere lungo il bordo dell'ombra, cioè ortogonale a un dato punto del bordo.
    3. Moltiplicare la maschera di peso da (2.) con tutte le immagini sfumate per ridurre / inumidire i bordi / i bordi dell'ombra.
    4. Integra le immagini con gradiente usando il codice dal link sopra.
    5. Per le immagini RGB, per mia esperienza, calcola la media dei canali separati delle immagini originali e ridimensiona le immagini integrate in modo che corrispondano a questi valori per evitare artefatti cromatici "divertenti".
  • Manipolazione della luminosità nel dominio dell'immagine originale.

    1. Usa la maschera d'ombra per generare una maschera di peso che è una delle regioni d'ombra esterne, ha una transizione graduale (verso l'alto) attraverso il confine dell'ombra e un fattore di scala più grande all'interno delle regioni d'ombra. Come suggerito in un precedente post, il fattore di scala può essere stimato dall'area immediatamente circostante un'area di ombra usando la luminosità media insieme alla luminosità media della regione d'ombra.
    2. Moltiplica le immagini originali (per canale) con la maschera di peso, soggetto a ritaglio.

Ho anche provato a utilizzare diversi modelli di colore, ad esempio HSV, che presentano direttamente la luminanza o la luminosità, che possono quindi essere modificate indipendentemente dal colore (tonalità / saturazione). Funziona essenzialmente come la manipolazione della luminosità, ovvero genera una maschera di peso uniforme e la moltiplica con il canale di luminanza. Forse i due approcci, ovvero l'integrazione del gradiente e la manipolazione della luminosità, possono essere combinati in modo intelligente, ma probabilmente qualcuno lo ha già provato prima.

Spero che aiuti, cordiali saluti, Derik.


2
Link sembra morto, ecco una versione cache .
Delgan,

9

Ho già visto questa immagine prima. In effetti, qui è nell'articolo stesso sull'argomento che stai cercando di risolvere. Seguito da un altro articolo dello stesso gruppo di ricerca della Simon Fraser University. Entrambi ti daranno una buona introduzione al problema della soluzione del colore per l'invarianza dell'illuminazione.


sì, lo so, ma stavo cercando di provare un metodo diverso per lo stesso problema
vini,

@vini: se hai letto che dovresti sapere cosa stai affrontando --- semplici operazioni morfologiche non lo taglieranno. Cos'altro hai letto e provato? Posso suggerire altri documenti se necessario.
Emre,

@Emre sto cercando di cambiare la luminosità in modo che l'effetto dell'ombra riduca comunque non molto successo .. Posso usare una mappa laterale per mascherare in qualche modo questa ombra .. sì, ho pensato che le operazioni morfologiche non avrebbero aiutato ho provato imsubtract (matlab) per rimuovere l'ombra
vini

5
@vini: questo problema va oltre le soluzioni one-liner. I documenti collegati (e ce ne sono anche altri) risolvono già il problema nella maggior parte dei casi, quindi se vuoi fare qualcosa di nuovo dovrai trovare i loro punti deboli, e questo significa comprenderli bene, quindi ti esorto a rileggerli accuratamente. Di solito menzionano problemi nelle sezioni Discussione e Conclusione. L'approccio di proiezione invariante-cromaticità dell'illuminazione-log mi sembra molto promettente ...
Emre,

4

Esistono diversi metodi che parlano del rilevamento dell'ombra essenzialmente funzionano su sfondo noto. Non c'è idea assoluta di cosa sia l' ombra solo guardando un colore di pixel. Tuttavia, è necessario identificare l'ombra senza riferimento.

Sebbene questo problema sia difficile, ecco una soluzione banale, anche se prontamente potrebbe non essere la migliore, ma potrebbe comunque aiutarti a ottenere qualche prospettiva.

Esaminiamo i componenti dell'immagine nel dominio HSL

coloreè Componente tonalità, Componente
Saturazionesaturazione ed Leggerezzaè Componente luminosità

È noto che la Leggerezza corrisponde strettamente all'equivalente grigio dell'immagine e che anche l'Ombra lo è essenzialmente

una regione semitrasparente in cui la riflessione della scena subisce un'attenuazione locale.

Da qui .

Quindi, è una sovrapposizione che diminuisce la riflettanza dicendo che l'oscurità è possibile identificare lo stesso nella parte grigia dell'immagine - ma troverete che l'interazione è molto meno nelle parti di colore (tonalità e saturazione in qualche modo).

Ora, qui, sono in grado di produrre due immagini: dove

  1. In questa prima immagine abbiamo rimosso il componente Lightness (sostituito con un valore medio fisso)
    inserisci qui la descrizione dell'immagine

  2. Nella seconda immagine abbiamo rimosso il componente Saturazione allo stesso modo Saturazione rimossa

Possiamo vedere che anche se la luminosità viene preservata ma viene rimossa la saturazione, le informazioni critiche sull'ombra sono intatte - dove come quando abbiamo rimosso la luminosità, le informazioni sull'ombra vengono eliminate in modo significativo. Sebbene ciò non sia perfetto, costituisce una caratteristica chiave che consente di distinguere ciò che è veramente un'ombra dallo sfondo.

Sulla base di questo, è possibile considerare l'immagine di "Leggerezza rimossa" come uno sfondo e l'altra come immagine incidente e segmentare l'immagine in base a queste due informazioni; Quindi nelle regioni in cui l'ombra non sta giocando un ruolo importante, la differenza potrebbe essere molto inferiore, dove come quando l'ombra esiste quel segmento mostrerà un errore elevato.

In alternativa puoi semplicemente applicare una segmentazione indipendente (come la regione in crescita) su entrambe le immagini. L'immagine rimossa dalla saturazione avrà un segmento aggiuntivo che non esisterà nell'immagine rimossa dalla luminosità che non è altro che un segmento d'ombra.

Nota: è possibile distinguere l'immagine rimossa dalla leggerezza HSL con l'originale stesso. Prova anche cose simili con lo spazio colore HSV e YCbCr.


2

È possibile prendere un istogramma dell'area mascherata (l'ombra) e applicare una trasformazione lineare del colore in modo che l'istogramma dell'area mascherata e il resto dell'immagine siano abbinati.

Suppongo che il fattore di scala nella trasformazione sarebbe trascurabile, sarebbe necessario solo uno spostamento della luminosità, quindi potresti semplicemente prendere la luminosità media dei due segmenti (ombra, dintorni) e applicare la differenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.