Как я могу удалить тени с изображения?

17

У меня есть это изображение

введите описание изображения здесь

Я хотел бы удалить тень с изображения. Я знаю, что для удаления теней использовалось много разных методов, например, определенные морфологические операции:

Я создал эту маску для того же изображения

введите описание изображения здесь

Есть ли другие способы, которые я мог бы попробовать использовать эту маску, которую я создал?

РЕДАКТИРОВАТЬ :

введите изображение и маску того же размера, что и запрошено:

введите описание изображения здесь

введите описание изображения здесь

РЕДАКТИРОВАТЬ 2: я сгенерировал 1D инвариантное изображение, однако оно не идеально

  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)

введите описание изображения здесь

Не могу понять, что я делаю не так, пожалуйста, помогите?

вини
источник
Хороший вопрос! Вы пробовали увеличить яркость в маскируемой области?
Дима
5
Проверьте мой ответ здесь: dsp.stackexchange.com/questions/454/…
datageist
Проще говоря, отражательная способность двух разных поверхностей различна, как в абсолютном выражении, так и в том, как они отражают прямой и непрямой свет. Поэтому они по-разному реагируют на нахождение в тени и нуждаются в разных формулах для отмены тени.
Даниэль Р Хикс
Существуют и другие методы, такие как обнаружение краев с использованием второй производной, с использованием градиента и оператора Лапласа.
1
Связанный вопрос: mathematica.stackexchange.com/questions/7414/…
Ники Эстнер

Ответы:

11

Существуют десятки публикаций, посвященных обнаружению теней, созданию теневых масок, и, действительно, некоторые, которые фактически удаляют тени - например, упомянутые в предыдущих постах. Я мог бы добавить некоторые в список, если это необходимо. Проблема, однако, ИМХО далека от решения. Для быстрого начала, учитывая теневую маску, я предлагаю (и уже пробовал в прошлом) два следующих подхода. Они определенно уменьшают тени - просто не всегда плавно, и я уверен, что есть публикации (не мной), посвященные удалению теней подобными способами.

  • Методы манипулирования доменом градиента, как описано здесь (предоставлены коды C и Matlab): http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html Подход интеграции градиента можно использовать для обработки изображений проблемы, см. слайды / презентацию для дальнейших примеров.

    Общая идея:

    1. Вычислить пространственные производные (изображения градиента) для всех цветовых каналов.
    2. Используйте теневые границы из теневой маски, чтобы сгенерировать весовую маску, которая близка к нулю на теневых границах и увеличивается до единицы в пределах заданной окрестности вдоль теневого края, то есть ортогонально заданной точке края.
    3. Умножьте весовую маску из (2.) на все градиентные изображения, чтобы уменьшить / ослабить границы / края теней.
    4. Интегрируйте градиентные изображения, используя код из ссылки выше.
    5. Для моего RGB-изображения, по моему опыту, вычислите среднее значение отдельных каналов исходных изображений и масштабируйте интегрированные изображения в соответствии с этими значениями, чтобы избежать «забавных» цветовых артефактов.
  • Яркость манипуляций в исходной области изображений.

    1. Используйте теневую маску, чтобы сгенерировать маску веса, которая находится за пределами теневых областей, имеет плавный переход (вверх) через теневую границу и более одного масштабного коэффициента внутри теневых областей. Как было предложено в предыдущем посте, масштабный коэффициент можно оценить по области, непосредственно окружающей область тени, используя среднюю яркость вместе со средней яркостью области тени.
    2. Умножьте исходные изображения (на канал) с помощью маски веса, с учетом отсечения.

Я также пытался использовать различные цветовые модели, например HSV, которые напрямую отображают яркость или яркость, которые затем можно изменять независимо от цвета (оттенок / насыщенность). Это работает в основном как манипулирование яркостью, то есть генерирует плавную маску веса и умножает ее на канал яркости. Может быть, два подхода - интеграцию градиента и манипулирование яркостью - можно с умом объединить, но, возможно, кто-то пытался сделать это и раньше.

Надеюсь, что это помогает, с уважением, Дерик.

Dr.D.
источник
2
Ссылка кажется мертвой, вот кешированная версия .
Дельган
9

Я видел это самое изображение раньше. На самом деле, это именно в той статье, тему которой вы хотите решить. Затем последовала еще одна статья из той же исследовательской группы в университете Саймона Фрейзера И то, и другое даст вам хорошее представление о проблеме решения цвета при неизменности освещения.

tiluki
источник
да, я знаю это, но пытался попробовать другой метод для той же проблемы
vini
@vini: Если вы читали, что должны знать, с чем вы столкнулись - простые морфологические операции не помогут. Что еще вы прочитали и попробовали? Я могу предложить другие документы, если это необходимо.
Эмре
@ Emre, я пытаюсь изменить яркость так, чтобы эффект тени уменьшал, однако не так много успеха .. Можно ли использовать карту краев, чтобы каким-то образом замаскировать эту тень? Да, я подумал, что морфологические операции не помогут, я попытался imsubtract (Matlab), чтобы удалить тень
Vini
5
@vini: эта проблема выходит за рамки однострочных решений. Связанные статьи (а также и другие) уже решают проблему в большинстве случаев, поэтому, если вы хотите сделать что-то новое, вам придется найти их слабые стороны, и это означает, что вы должны хорошо их понимать, поэтому я призываю вас перечитать их осторожно. Они обычно упоминают проблемы в разделах Обсуждение и Заключение. Подход проекции логарифмической инвариантности к освещению кажется мне наиболее перспективным ...
Эмре
4

Есть несколько методов, которые говорят об обнаружении теней по существу, работают на известном фоне. Не существует абсолютного понятия о том, что такое тень, просто глядя на цвет пикселя. Тем не менее, вам нужно определить тень без ссылки.

Хотя эта проблема сложная, здесь есть тривиальное решение, хотя оно может быть не самым лучшим, но, тем не менее, оно может помочь вам понять некоторые аспекты.

Давайте рассмотрим компоненты изображения в домене HSL

оттенокявляется компонентом оттенка, компонентом
насыщениенасыщенности и расторопностькомпонентом легкости

Хорошо известно, что Lightness близко соответствует серому эквиваленту изображения, а также, что Shadow по существу

полупрозрачная область, в которой отражение сцены испытывает локальное затухание.

От сюда .

Следовательно, это наложение, которое уменьшает отражательную способность в темноте, которую вы можете идентифицировать в серой части изображения - но вы обнаружите, что ее взаимодействие значительно меньше в цветных частях (оттенок и насыщенность до некоторой степени).

Теперь здесь я могу создать два изображения - где

  1. В этом первом изображении мы удалили компонент Lightness (заменив его фиксированным средним значением)
    введите описание изображения здесь

  2. На втором изображении мы удалили компонент Насыщенность таким же образом Насыщенность удалена

Мы можем видеть, что даже если яркость сохраняется, но насыщенность удаляется, критическая информация о тени остается неизменной - тогда как при удалении яркости информация о тени значительно уменьшается. Хотя это и не идеально, оно делает ключевую особенность, которая позволяет отличить тень от фона.

Исходя из этого, вы можете рассматривать изображение «Легкость снята» как фон, а другое - как падающее изображение и сегментировать изображение на основе этих двух данных; Таким образом, в регионах, где тень не играет главной роли, разница может быть намного меньше, тогда как при наличии тени этот сегмент будет показывать высокую погрешность.

В качестве альтернативы вы можете просто применить независимую сегментацию (например, рост региона) для обоих изображений. Изображение с удаленным насыщением будет иметь дополнительный сегмент, который не будет существовать на изображении с удаленным освещением, которое является ничем иным, как теневым сегментом.

Примечание. Вы можете различить изображение, снятое с помощью HSL-lightness, с самим оригиналом. Также попробуйте аналогичные вещи с цветовым пространством HSV, а также YCbCr.

Дипан Мехта
источник
2

Вы можете взять гистограмму замаскированной области (тени) и применить линейное преобразование цвета, чтобы гистограмма замаскированной области и остальной части изображения соответствовала.

Я предполагаю, что масштабный коэффициент в преобразовании будет незначительным, потребуется только смещение яркости, поэтому вы можете просто взять среднюю яркость двух сегментов (тень, окружение) и применить разность.

ЛИБОР
источник