Як я можу видалити тіні із зображення?


17

У мене є такий образ

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

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

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

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

Чи є якісь інші методи, я можу спробувати використовувати цю маску, яку я створив?

Редагувати :

вхідне зображення та маска того ж розміру, що і запитується:

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

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

EDIT 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

Є десятки публікацій, що займаються виявленням тіней, генерують тіньові маски і справді деякі, які фактично видаляють тіні - наприклад, ті, що згадувалися в попередніх публікаціях. Я можу додати трохи до списку, якщо потрібно. Однак проблема IMHO далеко не вирішена. Для швидкого старту, маючи тіньову маску, я пропоную (і спробував раніше) два наступні підходи. Вони, безумовно, зменшують тіні - просто не завжди безшовно, і я впевнений, що існують публікації (не на мене), які займаються видаленням тіні подібними способами.

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

    Загальна ідея:

    1. Обчисліть просторові похідні (градієнтні зображення) для всіх кольорових каналів.
    2. Використовуйте тіньові межі від тіньової маски, щоб створити маску ваги, яка близька до нуля на тіньових межах і збільшується до однієї в межах визначеного мікрорайону уздовж краю тіні, тобто ортогональної до заданої точки краю.
    3. Помножте маску ваги з (2.) на всі зображення градієнта, щоб зменшити / змочити тіньові межі / краї.
    4. Інтегруйте градієнтні зображення за допомогою коду із наведеного вище посилання.
    5. Для RGB-зображень, з мого досвіду, обчислюйте середнє значення окремих каналів оригінальних зображень та масштабуйте інтегровані зображення, щоб відповідати цим значенням, щоб запобігти "смішним" кольоровим артефактам.
  • Маніпулювання яскравістю у вихідному зображенні-домені.

    1. Використовуйте тіньову маску для створення вагової маски, яка є однією із зовнішніх тіньових областей, має плавний перехід (вгору) через межу тіні та більший, ніж один масштабний коефіцієнт, у межах тіньових областей. Як було запропоновано в попередньому дописі, масштабний коефіцієнт можна оцінити з області, безпосередньо оточуючої тіньову область, використовуючи середню яскравість разом із середньою яскравістю тіньової області.
    2. Помножте оригінальні зображення (на канал) за допомогою ваги-маски з урахуванням відсікання.

Я також спробував використовувати різні кольорові моделі, наприклад HSV, які безпосередньо представляють яскравість або яскравість, які потім можна змінювати незалежно від кольору (відтінок / насиченість). Це по суті працює як маніпуляція з яскравістю, тобто створює гладку маску ваги і помножує її з каналом яскравості. Можливо, два підходи, тобто інтеграція градієнта та маніпулювання яскравістю, можна поєднати розумно, але хтось, мабуть, намагався це зробити і раніше.

Сподіваюсь, що допомагає, з повагою, Дерік.


2
Посилання здається мертвим, ось кешована версія .
Дельган

9

Я бачив це саме зображення раніше. Насправді тут мова йде про саму статтю з теми, яку ви шукаєте вирішити. Далі йде інший документ із тієї ж дослідницької групи університету Саймона Фрейзера. І те й інше дасть вам хороший вступ до проблеми вирішення кольору для інваріантності освітлення.


так, я це знаю, але намагався спробувати інший метод для тієї ж проблеми
vini

@vini: Якщо ви прочитали, що вам слід знати, що ви проти - --- прості морфологічні операції не збираються його скорочувати. Що ще ви читали та пробували? Я можу запропонувати інші документи, якщо це потрібно.
Емре

@Emre Я намагаюся змінити яскравість, щоб ефект тіні зменшив, однак, не мав великого успіху. Чи можна використовувати карту ребер, щоб якось замаскувати цю тінь .. так, я зрозумів, що морфологічні операції не допоможуть мені спробувати непотріб (матлаб), щоб прибрати тінь
vini

5
@vini: Ця проблема виходить за рамки однолінійного рішення. Зв'язані документи (а також є й інші) вже вирішують проблему в більшості випадків, тому, якщо ви хочете зробити щось нове, вам доведеться знайти їх слабкі сторони, а це означає добре їх зрозуміти, тому я закликаю вас перечитати їх. ретельно. Зазвичай вони згадують про проблеми у розділах "Обговорення та висновки". Підхід проекції проекцій підсвічування-інваріантність освітлення-інваріантності здається мені найбільш перспективним ...
Emre

4

Існує кілька методів, які говорять про розпізнавання тіней, по суті, працюють на відомому тлі. Не існує абсолютного поняття, що таке тінь, лише дивлячись на колір пікселя. Однак вам потрібно визначити тінь без посилання.

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

Розглянемо компоненти зображення в домені HSL

Відтінокє компонентом відтінку,
Насиченняє компонентом насичення і Легкістьє компонентом легкості

Добре відомо, що Легкість тісно відповідає сірому еквіваленту зображення, а також, що Тінь є по суті

напівпрозора область, в якій вплив сцени зазнає локального ослаблення.

Від сюди .

Отже, це накладення, яке зменшує відбиття зазначеної темряви, ви можете виявити те саме в сірій частині зображення - але ви виявите, що це взаємодія набагато менше у кольорових частинах (відтінок і насиченість дещо).

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

  1. У цьому першому зображенні ми видалили компонент Легкість (замінено фіксованим середнім значенням)
    введіть тут опис зображення

  2. У другому зображенні ми таким же чином видалили компонент насичення Насичення знято

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

Виходячи з цього, ви можете розглядати зображення "Знята легкість" як фонове, а інше - як інцидентне зображення та сегментувати зображення на основі цих двох даних; Тож у регіонах, де тінь не грає головної ролі, різниця може бути набагато меншою, де, як коли існує тінь, цей сегмент покаже високу помилку.

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

Примітка. Ви можете відрізнити знімане HSL-легкість зображення з оригінальним. Спробуйте також подібні речі з кольором простору HSV, а також YCbCr.


2

Ви можете взяти гістограму замаскованої області (тіні) та застосувати лінійне перетворення кольорів, щоб гістограма замаскованої області та решти зображень відповідала.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.