如何从图像中去除阴影?

信息处理 图像处理
2022-01-04 02:14:04

我有这张图片

在此处输入图像描述

我想从图像中删除阴影。我知道很多不同的方法,比如某些形态学操作已经被用来去除阴影:

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

在此处输入图像描述

是否有其他方法可以尝试使用我创建的这个面具?

编辑

输入图像和与请求大小相同的掩码:

在此处输入图像描述

在此处输入图像描述

编辑 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)

在此处输入图像描述

无法理解我在这里做错了什么请帮忙?

4个回答

有数十种出版物涉及阴影检测、生成阴影遮罩,实际上还有一些可以真正去除阴影——例如前面文章中提到的那些。如果需要,我可以在列表中添加一些。但是,恕我直言,问题远未解决。为了快速入门,给定阴影遮罩,我建议(并且过去曾尝试过)以下两种方法。它们肯定会减少阴影 - 只是并不总是无缝的,而且我确信有出版物(不是我的)以类似的方式处理阴影去除。

  • 此处描述的梯度域操作技术(提供 C 和 Matlab 代码): http ://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html 梯度集成方法可用于许多图像处理问题,请参阅幻灯片/演示文稿以获取更多示例。

    总体思路:

    1. 计算所有颜色通道的空间导数(梯度图像)。
    2. 使用来自阴影掩模的阴影边界来生成在阴影边界上接近于零的权重掩模,并在沿阴影边缘的指定邻域内增加到一,即与给定边缘点正交。
    3. 将 (2.) 中的权重掩码与所有梯度图像相乘,以减少/抑制阴影边界/边缘。
    4. 使用上述链接中的代码集成渐变图像。
    5. 对于 RGB 图像,根据我的经验,计算原始图像的单独通道的平均值,并缩放集成图像以匹配这些值以防止“有趣”的颜色伪影。
  • 原始图像域中的亮度操作。

    1. 使用阴影掩码生成一个权重掩码,该权重掩码是阴影区域外的一个,在阴影边界上具有平滑过渡(向上),并且在阴影区域内的比例因子大于一个。正如前一篇文章中所建议的那样,可以使用平均亮度和阴影区域的平均亮度从紧邻阴影区域的区域估计比例因子。
    2. 将原始图像(每个通道)与权重掩码相乘,但要进行裁剪。

我还尝试使用不同的颜色模型,例如 HSV,直接呈现亮度或亮度,然后可以独立于颜色(色调/饱和度)进行修改。这基本上像亮度操作一样工作,即生成一个平滑的权重掩码并将其与亮度通道相乘。也许这两种方法,即梯度积分和亮度操纵,可以以一种巧妙的方式结合起来,但以前可能也有人尝试过。

希望有帮助,亲切的问候,德里克。

我以前见过这个形象。实际上,它就在您要解决的主题的论文中。随后是西蒙弗雷泽大学同一研究小组的另一篇论文。这两个都会很好地介绍解决光照不变性的颜色问题。

有几种方法可以讨论阴影检测本质上是在已知背景下工作的。仅通过查看像素颜色就没有绝对的阴影概念。但是,您需要在没有参考的情况下识别阴影。

虽然这个问题很难,但这里有一个简单的解决方案——尽管这可能不是最好的解决方案,但它可能会帮助你获得一些观点。

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

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

众所周知,Lightness 与图像的灰度等价物紧密对应,Shadow 本质上是

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

这里

因此,它是一种降低反射率的叠加层,您可以在图像的灰色部分识别出相同的暗度 - 但您会发现它在颜色部分(色调和饱和度)的相互作用要少得多。

现在,在这里,我能够生成两个图像 - 其中

  1. 在第一张图片中,我们删除了亮度分量(替换为固定平均值)
    在此处输入图像描述

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

我们可以看到,即使保留了亮度但移除了饱和度,关于阴影的关键信息仍然完好无损——当我们移除亮度时,阴影信息显着下降。尽管这并不完美,但它是一个关键功能,可以让您从背景中区分出真正的阴影。

基于此,您可以将“Lightness removed”图像视为背景,将另一张图像视为入射图像,并根据这两个信息对图像进行分割;因此,在阴影没有发挥主要作用的区域,差异可能要小得多,当阴影存在时,该段将显示出高误差。

或者,您可以在两个图像上应用独立分割(例如区域增长)。去除饱和度的图像将有额外的部分,这在去除亮度的图像中不存在,它只是一个阴影部分。

注意:您可以将 HSL-lightness-removed 图像与原始图像区分开来。还可以尝试使用 HSV 颜色空间和 YCbCr 进行类似的操作。

您可以获取蒙版区域(阴影)的直方图并应用线性颜色变换,以便蒙版区域的直方图与图像的其余部分匹配。

我想变换中的比例因子可以忽略不计,只需要改变亮度,所以你可以只取两段(阴影、环绕)的平均亮度并应用差异。