У меня есть это изображение
Я хотел бы удалить тень с изображения. Я знаю, что для удаления теней использовалось много разных методов, например, определенные морфологические операции:
Я создал эту маску для того же изображения
Есть ли другие способы, которые я мог бы попробовать использовать эту маску, которую я создал?
РЕДАКТИРОВАТЬ :
введите изображение и маску того же размера, что и запрошено:
РЕДАКТИРОВАТЬ 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)
Не могу понять, что я делаю не так, пожалуйста, помогите?
image-processing
вини
источник
источник
Ответы:
Существуют десятки публикаций, посвященных обнаружению теней, созданию теневых масок, и, действительно, некоторые, которые фактически удаляют тени - например, упомянутые в предыдущих постах. Я мог бы добавить некоторые в список, если это необходимо. Проблема, однако, ИМХО далека от решения. Для быстрого начала, учитывая теневую маску, я предлагаю (и уже пробовал в прошлом) два следующих подхода. Они определенно уменьшают тени - просто не всегда плавно, и я уверен, что есть публикации (не мной), посвященные удалению теней подобными способами.
Методы манипулирования доменом градиента, как описано здесь (предоставлены коды C и Matlab): http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html Подход интеграции градиента можно использовать для обработки изображений проблемы, см. слайды / презентацию для дальнейших примеров.
Общая идея:
Яркость манипуляций в исходной области изображений.
Я также пытался использовать различные цветовые модели, например HSV, которые напрямую отображают яркость или яркость, которые затем можно изменять независимо от цвета (оттенок / насыщенность). Это работает в основном как манипулирование яркостью, то есть генерирует плавную маску веса и умножает ее на канал яркости. Может быть, два подхода - интеграцию градиента и манипулирование яркостью - можно с умом объединить, но, возможно, кто-то пытался сделать это и раньше.
Надеюсь, что это помогает, с уважением, Дерик.
источник
Я видел это самое изображение раньше. На самом деле, это именно в той статье, тему которой вы хотите решить. Затем последовала еще одна статья из той же исследовательской группы в университете Саймона Фрейзера И то, и другое даст вам хорошее представление о проблеме решения цвета при неизменности освещения.
источник
Есть несколько методов, которые говорят об обнаружении теней по существу, работают на известном фоне. Не существует абсолютного понятия о том, что такое тень, просто глядя на цвет пикселя. Тем не менее, вам нужно определить тень без ссылки.
Хотя эта проблема сложная, здесь есть тривиальное решение, хотя оно может быть не самым лучшим, но, тем не менее, оно может помочь вам понять некоторые аспекты.
Давайте рассмотрим компоненты изображения в домене HSL
является компонентом оттенка, компонентом
насыщенности и компонентом легкости
Хорошо известно, что Lightness близко соответствует серому эквиваленту изображения, а также, что Shadow по существу
От сюда .
Следовательно, это наложение, которое уменьшает отражательную способность в темноте, которую вы можете идентифицировать в серой части изображения - но вы обнаружите, что ее взаимодействие значительно меньше в цветных частях (оттенок и насыщенность до некоторой степени).
Теперь здесь я могу создать два изображения - где
В этом первом изображении мы удалили компонент Lightness (заменив его фиксированным средним значением)
На втором изображении мы удалили компонент Насыщенность таким же образом
Мы можем видеть, что даже если яркость сохраняется, но насыщенность удаляется, критическая информация о тени остается неизменной - тогда как при удалении яркости информация о тени значительно уменьшается. Хотя это и не идеально, оно делает ключевую особенность, которая позволяет отличить тень от фона.
Исходя из этого, вы можете рассматривать изображение «Легкость снята» как фон, а другое - как падающее изображение и сегментировать изображение на основе этих двух данных; Таким образом, в регионах, где тень не играет главной роли, разница может быть намного меньше, тогда как при наличии тени этот сегмент будет показывать высокую погрешность.
В качестве альтернативы вы можете просто применить независимую сегментацию (например, рост региона) для обоих изображений. Изображение с удаленным насыщением будет иметь дополнительный сегмент, который не будет существовать на изображении с удаленным освещением, которое является ничем иным, как теневым сегментом.
Примечание. Вы можете различить изображение, снятое с помощью HSL-lightness, с самим оригиналом. Также попробуйте аналогичные вещи с цветовым пространством HSV, а также YCbCr.
источник
Вы можете взять гистограмму замаскированной области (тени) и применить линейное преобразование цвета, чтобы гистограмма замаскированной области и остальной части изображения соответствовала.
Я предполагаю, что масштабный коэффициент в преобразовании будет незначительным, потребуется только смещение яркости, поэтому вы можете просто взять среднюю яркость двух сегментов (тень, окружение) и применить разность.
источник