Mam ten obraz
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
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:
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)
Nie możesz zrozumieć, co robię źle tutaj, proszę o pomoc?
image-processing
vini
źródło
źródło
Odpowiedzi:
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ł:
Manipulacja jasnością w oryginalnej domenie obrazu.
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.
źródło
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.
źródło
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
jest składnikiem barwy,
jest składnikiem nasycenia i jest składnikiem lekkości
Powszechnie wiadomo, że Lekkość ściśle odpowiada szaremu odpowiednikowi obrazu, a także, że Cień jest zasadniczo
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
Na tym pierwszym zdjęciu usunęliśmy składnik Lekkość (zastąpiony stałą wartością średnią)
Na drugim obrazie usunęliśmy komponent nasycenia w ten sam sposób
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.
źródło
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ę.
źródło