Jak mogę usunąć cienie z obrazu?

17

Mam ten obraz

wprowadź opis zdjęcia tutaj

Chciałbym usunąć cień z obrazu. Wiem, że do usuwania cieni zastosowano wiele różnych metod, takich jak pewne operacje morfologiczne:

Stworzyłem tę maskę dla tego samego obrazu

wprowadź opis zdjęcia tutaj

Czy istnieją inne metody, które mogłem wypróbować przy użyciu tej maski, którą utworzyłem?

EDYCJA :

obraz wejściowy i maska ​​o takim samym rozmiarze, jak wymagane:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

EDYCJA 2: Wygenerowałem niezmienny obraz 1D, jednak nie jest on idealny

  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)

wprowadź opis zdjęcia tutaj

Nie możesz zrozumieć, co robię źle tutaj, proszę o pomoc?

vini
źródło
Dobre pytanie! Czy próbowałeś zwiększyć jasność w zamaskowanym regionie?
Dima
5
Sprawdź moją odpowiedź tutaj: dsp.stackexchange.com/questions/454/…
Datageist
Mówiąc prościej, współczynnik odbicia dwóch różnych powierzchni jest inny, zarówno w wartościach bezwzględnych, jak i w jaki sposób odbijają światło bezpośrednie w porównaniu z pośrednim. Dlatego reagują inaczej na bycie w cieniu i potrzebują różnych formuł do anulowania cienia.
Daniel R Hicks,
Istnieją inne metody, takie jak wykrywanie krawędzi przy użyciu drugiej pochodnej, przy użyciu gradientu i operatora Laplaciana.
1
Powiązane pytanie: mathematica.stackexchange.com/questions/7414/…
Niki Estner

Odpowiedzi:

11

Istnieją dziesiątki publikacji zajmujących się wykrywaniem cieni, generujących maski cienia, a nawet takie, które faktycznie usuwają cienie - takie jak te wspomniane w poprzednich postach. W razie potrzeby mogę dodać trochę do listy. Problemem jest jednak to, że IMHO jest daleki od rozwiązania. Na początek, biorąc pod uwagę maskę cienia, sugeruję (i próbowałem w przeszłości) dwa następujące podejścia. Zdecydowanie redukują cienie - po prostu nie zawsze są płynne i jestem pewien, że istnieją publikacje (nie przeze mnie) dotyczące usuwania cieni w podobny sposób.

  • Techniki manipulacji domeną gradientu, jak opisano tutaj (dostarczone kody C i Matlab): http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html Podejście do integracji gradientów można zastosować do wielu procesów przetwarzania obrazu problemy, zobacz slajdy / prezentację w celu uzyskania dalszych przykładów.

    Ogólny pomysł:

    1. Oblicz pochodne przestrzenne (obrazy gradientowe) dla wszystkich kanałów kolorów.
    2. Użyj granic cienia z maski cienia, aby wygenerować masę wagi, która jest bliska zeru na granicach cienia i zwiększa się do jednego w określonym sąsiedztwie wzdłuż krawędzi cienia, tj. Prostopadle do danego punktu krawędzi.
    3. Pomnóż maskę wagi z (2.) ze wszystkimi obrazami gradientu, aby zmniejszyć / wytłumić granice / krawędzie cienia.
    4. Zintegruj obrazy gradientu za pomocą kodu z powyższego łącza.
    5. Z moich doświadczeń wynika, że ​​obliczam średnią z oddzielnych kanałów oryginalnych obrazów i skaluję zintegrowane obrazy, aby dopasować je do tych wartości, aby zapobiec „śmiesznym” artefaktom kolorów.
  • Manipulacja jasnością w oryginalnej domenie obrazu.

    1. Użyj maski cienia, aby wygenerować maskę wagi, która jest jednym poza obszarami cienia, ma płynne przejście (w górę) przez granicę cienia i większy niż jeden współczynnik skali w obszarach cienia. Jak zasugerowano w poprzednim poście, współczynnik skali można oszacować na podstawie obszaru bezpośrednio otaczającego obszar cienia, używając średniej jasności wraz ze średnią jasnością regionu cienia.
    2. Pomnóż oryginalne obrazy (na kanał) za pomocą maski wagowej, z zastrzeżeniem obcinania.

Próbowałem także użyć różnych modeli kolorów, np. HSV, które bezpośrednio prezentują luminancję lub jasność, które można następnie modyfikować niezależnie od koloru (barwy / nasycenia). Działa to w zasadzie jak manipulacja jasnością, tzn. Generuje gładką maskę masy i pomnaża ją przez kanał luminancji. Być może te dwa podejścia, tj. Całkowanie gradientu i manipulowanie jasnością, można połączyć w sprytny sposób, ale prawdopodobnie ktoś już tego próbował.

Mam nadzieję, że pomaga, pozdrawiam, Derik.

Dr.D.
źródło
2
Link wydaje się martwy, oto wersja z pamięci podręcznej .
Delgan
9

Widziałem już ten obraz wcześniej. W rzeczywistości jest to w artykule na temat, który chcesz rozwiązać. Następnie opublikowano kolejny artykuł z tej samej grupy badawczej na Uniwersytecie Simona Frasera. Oba te elementy stanowią dobre wprowadzenie do rozwiązania problemu koloru dla niezmienności oświetlenia.

tiluki
źródło
tak, wiem o tym, ale próbowałem wypróbować inną metodę dla tego samego problemu
vini
@vini: Jeśli przeczytałeś, że powinieneś wiedzieć, co masz przeciwko --- proste operacje morfologiczne nie zamierzają tego obciąć. Co jeszcze przeczytałeś i wypróbowałeś? W razie potrzeby mogę zasugerować inne dokumenty.
Emre
@ Emre próbuję zmienić jasność, aby efekt cienia zmniejszał jednak niewielki sukces. Czy można użyć mapy krawędzi, aby jakoś maskować ten cień .. tak, pomyślałem, że operacje morfologiczne nie pomogą mi próbować (Matlab), aby usunąć cień
vini
5
@vini: Ten problem wykracza poza rozwiązania jedno-liniowe. Powiązane dokumenty (i są też inne) już rozwiązują problem w większości przypadków, więc jeśli chcesz zrobić coś nowego, musisz znaleźć ich słabości, a to oznacza, że ​​dobrze je rozumiesz, więc zachęcam do ich ponownego przeczytania ostrożnie. Zazwyczaj wspominają problemy w sekcjach Dyskusja i Wnioski. Najbardziej obiecujące wydaje mi się podejście do projekcji niezmiennej iluminacji logarytmiczno-chromatycznej ...
Emre
4

Istnieje kilka metod, które mówią, że wykrywanie Cienia działa zasadniczo na znanym tle. Nie ma absolutnego pojęcia, czym jest cień , patrząc tylko na kolor piksela. Musisz jednak zidentyfikować cień bez odniesienia.

Chociaż ten problem jest trudny, oto trywialne rozwiązanie - choć z łatwością może nie być najlepsze, ale mimo to może pomóc ci zdobyć perspektywę.

Przeanalizujmy komponenty obrazu w domenie HSL

Odcieńjest składnikiem barwy,
Nasyceniejest składnikiem nasycenia i Lekkośćjest składnikiem lekkości

Powszechnie wiadomo, że Lekkość ściśle odpowiada szaremu odpowiednikowi obrazu, a także, że Cień jest zasadniczo

półprzezroczysty region, w którym odbicie sceny podlega lokalnemu tłumieniu.

Od tutaj .

Dlatego jest to nakładka, która zmniejsza współczynnik odbicia, mówi się, że ciemność można rozpoznać w szarej części obrazu - ale przekonasz się, że gra ona znacznie mniej w częściach kolorystycznych (Barwa i nieco nasycenie).

Teraz jestem w stanie wyprodukować dwa obrazy - gdzie

  1. Na tym pierwszym zdjęciu usunęliśmy składnik Lekkość (zastąpiony stałą wartością średnią)
    wprowadź opis zdjęcia tutaj

  2. Na drugim obrazie usunęliśmy komponent nasycenia w ten sam sposób Nasycenie zostało usunięte

Widzimy, że nawet jeśli jasność zostanie zachowana, ale nasycenie zostanie usunięte, krytyczna informacja o cieniu pozostaje nienaruszona - kiedy to, jak usunęliśmy jasność, informacja o cieniu zostaje znacznie upuszczona. Chociaż nie jest to idealne, stanowi kluczową cechę, która pozwala odróżnić, co naprawdę jest cieniem od tła.

Na tej podstawie możesz traktować obraz „Usunięty lekkość” jako tło, a drugi jako obraz zdarzenia i segmentować obraz na podstawie tych dwóch informacji; Tak więc w regionach, w których cień nie odgrywa dużej roli, różnica może być znacznie mniejsza, gdy tak jak w przypadku cienia, ten segment będzie wykazywał wysoki błąd.

Alternatywnie możesz po prostu zastosować niezależną segmentację (na przykład powiększanie regionu) na obu obrazach. Obraz z usuniętym nasyceniem będzie miał dodatkowy segment, który nie będzie istniał w obrazie z usuniętą jasnością, który jest jedynie segmentem cienia.

Uwaga: Możesz odróżnić obraz usunięty z lekkości HSL za pomocą samego oryginału. Spróbuj również podobnych rzeczy z przestrzenią kolorów HSV, a także YCbCr.

Dipan Mehta
źródło
2

Możesz wziąć histogram zamaskowanego obszaru (cień) i zastosować liniową transformację kolorów, aby dopasować histogram zamaskowanego obszaru i reszty obrazu.

Podejrzewam, że współczynnik skali w transformacji byłby znikomy, konieczne byłoby jedynie przesunięcie jasności, więc możesz po prostu wziąć średnią jasność dwóch segmentów (cień, otoczenie) i zastosować różnicę.

Libor
źródło