如何从图像中去除阴影?


17

我有这张图片

在此处输入图片说明

我想从图像中去除阴影。我知道许多不同的方法(例如某些形态学运算)已用于去除阴影:

我为同一张图片创建了此蒙版

在此处输入图片说明

我还有其他方法可以尝试使用创建的此蒙版吗?

编辑

输入与要求尺寸相同的图像和遮罩:

在此处输入图片说明

在此处输入图片说明

编辑2:我生成了一维不变图像,但它并不完美

  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

简单来说,两个不同表面的反射率在绝对意义上以及它们反射直接与间接光的方式上都是不同的。因此,他们对处于阴影中的反应不同,并且需要不同的公式来消除阴影。
Daniel R Hicks

还有其他方法,例如使用二阶导数,使用梯度的边缘检测和拉普拉斯算子。

Answers:


11

有数十种出版物涉及阴影检测,生成阴影蒙版,甚至确实有一些可以去除阴影的出版物,例如以前的文章中提到的那些出版物。如果需要,我可以将一些添加到列表中。但是,IMHO的问题远未解决。为了快速入门,给定了一个遮罩,我建议(并且以前尝试过)以下两种方法。它们肯定会减少阴影-并非总是无缝的,而且我敢肯定有些出版物(不是我本人)以类似的方式处理阴影。

  • 此处介绍的梯度域操作技术(提供了C和Matlab代码): http ://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html梯度积分方法可用于许多图像处理问题,请参见幻灯片/演示以获得更多示例。

    总体思路:

    1. 计算所有颜色通道的空间导数(渐变图像)。
    2. 使用阴影蒙版中的阴影边界生成一个权重蒙版,该加权蒙版在阴影边界上接近零,并在沿阴影边缘的指定邻域(即与给定边缘点正交)内增加到一个。
    3. 将(2.)中的权重蒙版与所有渐变图像相乘,以减少/减弱阴影边界/边缘。
    4. 使用上面链接中的代码对渐变图像进行积分。
    5. 根据我的经验,对于RGB图像,请计算原始图像各个通道的平均值,然后缩放积分图像以匹配这些值,以防止出现“有趣”的颜色伪像。
  • 原始图像域中的亮度处理。

    1. 使用阴影蒙版生成一个权重蒙版,该加权蒙版是一个位于阴影区域外部的阴影,在阴影边界上具有平滑的过渡(向上),并且在阴影区域内部具有大于一个比例因子的比例。如前一篇文章中所建议的,可以使用阴影区域的平均亮度和平均亮度,从阴影区域附近的区域中估算出比例因子。
    2. 将原始图像(每个通道)与权重蒙版相乘,以进行裁剪。

我还尝试使用不同的颜色模型,例如HSV,它们直接显示亮度或亮度,然后可以独立于颜色(色相/饱和度)进行修改。这基本上类似于亮度操纵,即生成平滑的权重蒙版,并将其与亮度通道相乘。也许可以以一种巧妙的方式将梯度积分和亮度操纵这两种方法结合起来,但有人可能也曾经尝试过。

希望对您有所帮助,德里克。


2
链接似乎已死,这是一个缓存的版本
Delgan,2016年

9

我以前看过这张照片。实际上,这正是您要解决的主题的论文。随后是西蒙·弗雷泽大学同一研究小组的另一篇论文。这些都将为您很好地介绍解决灯光不变性的颜色的问题。


是的,我知道,但是我正尝试尝试使用不同的方法来解决相同的问题
年份

@vini:如果您已经阅读了您应该知道的内容,那么简单的形态学操作就不会削减它。您还阅读并尝试了什么?如果需要,我可以建议其他论文。
Emre 2012年

@Emre我正在尝试更改亮度,以使阴影效果降低,但是效果不佳。.可以使用边缘贴图以某种方式掩盖此阴影吗..是的,我认为形态学运算无法帮助我尝试减法(matlab)消除阴影
年份

5
@vini:这个问题不仅仅是一线解决方案。链接的论文(还有其他论文)已经在大多数情况下解决了问题,因此,如果您想做一些新的事情,您将不得不发现它们的弱点,这意味着必须很好地理解它们,因此我敦促您重新阅读它们。小心。他们通常在“讨论和结论”部分中提到问题。对数色度照明不变投影方法对我来说似乎最有前途...
Emre

4

有几种谈论阴影检测的方法实际上是在已知背景下工作的。仅通过查看像素颜色,没有关于阴影的绝对概念。但是,您需要识别阴影而无需参考。

尽管这个问题很难解决,但这是一个简单的解决方案-尽管很可能这不是最好的解决方案,但是尽管如此,它仍可以帮助您获得一些看法。

让我们检查HSL域中的图像组件

色调是色相分量,
饱和饱和度分量和 亮度亮度分量

众所周知,亮度与图像的灰度相当,阴影也从本质上讲

半透明区域,其中场景反射经历局部衰减。

这里

因此,它是一个可以降低反射率的覆盖层,例如,您可以在图像的灰色部分识别出暗度,但是您会发现它在彩色部分的相互影响要小得多(色调和饱和度有所提高)。

现在,在这里,我可以生成两个图像-其中

  1. 在第一张图片中,我们删除了亮度成分(以固定的平均值替换)
    在此处输入图片说明

  2. 在第二张图片中,我们以相同的方式删除了饱和度分量 饱和度已删除

我们可以看到,即使保留了明度但消除了饱和度,有关阴影的关键信息仍然完好无损-就像我们删除明度时一样,阴影信息也大大降低了。尽管这并不完美,但它具有一项关键功能,可让您从背景中区分出真正的阴影。

基于此,您可以将“去除亮度”图像作为背景,将另一个图像作为入射图像,并根据这两个信息对图像进行分割;因此,在阴影不占主要地位的区域中,差异可能会小得多,而当阴影存在时,该细分将显示出较高的误差。

或者,您可以只对两个图像应用独立的分割(例如区域增长)。去除饱和度的图像将具有附加部分,该部分将不在去除阴影的图像中存在,而是阴影部分。

注意:您可以将已去除HSL亮度的图像与原始图像区分开。也可以使用HSV颜色空间和YCbCr尝试类似的操作。


2

您可以对蒙版区域(阴影)进行直方图处理并应用线性颜色变换,以使蒙版区域的直方图与图像的其余部分匹配。

我想变换中的比例因子可以忽略不计,只需要舍弃亮度,因此您可以只取两个片段(阴影,舍入)的平均亮度并应用差值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.