我想从图像中去除阴影。我知道许多不同的方法(例如某些形态学操作)已用于去除阴影:
我为同一图像创建了此蒙版。
还有其他方法可以尝试使用我创建的此蒙版吗?
编辑:
输入图像和要求的蒙版大小相同:
编辑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)
无法理解我在做什么错,请帮忙吗?
#1 楼
有数十种出版物涉及阴影检测,生成阴影蒙版,甚至确实有一些可以去除阴影的出版物,例如以前的文章中提到的那些出版物。如果需要,我可以将一些添加到列表中。然而,恕我直言,这个问题远未解决。为了快速入门,给定了一个遮罩,我建议(并且以前尝试过)以下两种方法。它们肯定会减少阴影-并非总是无缝的,而且我敢肯定有些出版物(不是我本人)以类似的方式处理阴影。Gradient Domain此处描述的操作技术(提供了C和Matlab代码):
http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html
梯度积分方法可用于许多图像处理问题,请参见幻灯片/演示文稿以获取更多示例。
总体思路:
计算空间导数(梯度图像)适用于所有颜色通道。
使用阴影遮罩中的阴影边界生成权重遮罩,该权重遮罩在阴影边界上接近零,并在沿阴影边缘的指定邻域内增加到一个,即
将(2.)中的权重蒙版与所有渐变图像相乘,以减少/减弱阴影边界/边缘。
使用来自t的代码他上面的链接。
根据我的经验,对于RGB图像,请计算原始图像各个通道的平均值,并缩放积分图像以匹配这些值,以防止出现“有趣”的颜色伪像。 >
原始图像域中的亮度处理。
使用阴影蒙版生成一个权重蒙版,该蒙版是一个位于阴影区域外部的阴影,在阴影边界上具有平滑的过渡(向上),并且在阴影区域内部具有大于一个比例因子的比例。如前一篇文章所述,可以使用阴影区域的平均亮度和平均亮度,从阴影区域周围的区域估算出比例因子。
将原始图像乘以通道)和重量蒙版,可能会被剪切。
我也尝试过使用不同的颜色模型,例如HSV,直接显示亮度或亮度,然后可以独立于颜色(色相/饱和度)进行修改。这基本上类似于亮度操纵,即生成平滑的权重蒙版,并将其与亮度通道相乘。也许可以以一种巧妙的方式将梯度积分和亮度操纵这两种方法结合起来,但有人可能也曾经尝试过。
希望能有所帮助的Derik。
/>
评论
$ \ begingroup $
链接似乎已失效,这是一个缓存的版本。
$ \ endgroup $
–德尔甘
16年6月21日在12:12
#2 楼
我以前看过这张照片。实际上,这正是您要解决的主题的论文。随后是西蒙·弗雷泽大学同一研究小组的另一篇论文。这些都将为您很好地介绍解决灯光不变性的颜色的问题。评论
$ \ begingroup $
是的,我知道,但是正在尝试针对同一问题尝试其他方法
$ \ endgroup $
– Vini
2012年5月4日9:58
$ \ begingroup $
@vini:如果您已读过书,那么您应该知道自己所反对的是-简单的形态学运算就不会削减它。您还阅读并尝试了什么?如果需要,我可以建议其他论文。
$ \ endgroup $
–埃姆雷
2012年5月4日18:38
$ \ begingroup $
@Emre我正在尝试更改亮度,以使阴影效果降低,但是效果不佳。.可以使用边缘贴图以某种方式掩盖此阴影吗..是的,我认为形态学操作不会帮助我尝试过减法(matlab)去除阴影
$ \ endgroup $
– Vini
2012年5月5日6:26
$ \ begingroup $
@vini:这个问题不仅仅是一线解决方案。链接的论文(还有其他论文)已经在大多数情况下解决了问题,因此,如果您想做新的事情,您将不得不发现它们的弱点,这意味着必须对它们有所了解,因此我敦促您重新阅读它们。小心。他们通常在“讨论和结论”部分中提到问题。对数色度照明不变投影方法对我来说似乎最有前途...
$ \ endgroup $
–埃姆雷
2012年5月5日7:39
#3 楼
有几种谈论阴影检测的方法实际上是在已知背景下起作用的。仅通过查看像素颜色,就没有阴影的绝对概念。但是,您需要识别阴影而无需参考。虽然这个问题很难解决,但这是一个微不足道的解决方案-尽管很可能这不是最好的解决方案,但是它可能会帮助您获得一些看法。
让我们检查HSL域中的图像分量
是色相分量,是饱和度分量,
是亮度分量
>众所周知,“亮度”与图像的灰度等效非常接近,并且“阴影”本质上是一个半透明区域,其中场景反射经历了一个半透明区域。
局部衰减。
从这里开始。
因此,它是一个覆盖层,可以降低反射率,例如暗度
可以在灰色中识别出相同的图像的一部分-但您会发现它在彩色部分中的相互作用要少得多(色调和饱和度有所提高)。
现在,我可以生成两个图像-其中
在第二个图像中,我们以相同的方式删除了饱和度分量
我们可以看到,即使保留了亮度但去除了饱和度,有关阴影的关键信息是完好无损的-就像我们删除亮度时一样,阴影信息也大大减少了。尽管这并不完美,但它具有关键功能,可让您从背景中区分出真正的阴影。
基于此,您可以将“去除亮度”图像作为背景,将另一个图像作为入射图像,并根据这两个信息对图像进行分割;因此,在阴影不占主要地位的区域中,差异可能会小得多,因为当阴影存在时,该细分市场将显示出较高的误差。
或者,您也可以在两个图像上应用独立的分割(例如区域增长)。去除饱和度的图像将具有在去除亮度的图像中不存在的附加片段,该片段仅是阴影片段。
注意:您可以将已去除HSL亮度的图像与原始图像区分开。也可以尝试使用HSV颜色空间和YCbCr进行类似的操作。
评论
好问题!您是否尝试过增加遮蔽区域的亮度?在这里检查我的答案:dsp.stackexchange.com/questions/454/…
简单来说,两个不同表面的反射率在绝对意义上以及它们反射直接与间接光的方式上都是不同的。因此,他们对阴影的反应不同,需要不同的公式来消除阴影。
还有其他方法,例如使用二阶导数,使用梯度的边缘检测和Laplacian运算符。
相关问题:mathematica.stackexchange.com/questions/7414/…