【问题标题】:How to detect and eliminate the shadows when having the images of foreground and background?有前景和背景图像时如何检测和消除阴影?
【发布时间】:2015-03-14 18:08:52
【问题描述】:

我有前景和背景的图像。虽然我想从前景中减去背景,但前景图像还包含我想要消除的工件的阴影。

我遇到了完成以下工作的this 代码。

上述操作的代码是:

`a=imread('foreground.jpg');
b=imread('background.jpg');
da=double(a);
db=double(b);
D=imabsdiff(a,b);
r=zeros(240,320);
h=a;
for ix=1:240
    for iy=1:320
        if D(ix,iy)>20
            if da(ix,iy,1)~=0&da(ix,iy,2)~=0&da(ix,iy,3)~=0
                if (db(ix,iy,1)/da(ix,iy,1)<4)&(db(ix,iy,1)/da(ix,iy,1)>1.5)
                    if (db(ix,iy,2)/da(ix,iy,2)<2.8)&(db(ix,iy,2)/da(ix,iy,2)>1.3)
                        if (db(ix,iy,3)/da(ix,iy,3)<2.05)&(db(ix,iy,3)/da(ix,iy,3)>1.14)
                            if (db(ix,iy,3)/da(ix,iy,3)<db(ix,iy,1)/da(ix,iy,1))&(db(ix,iy,3)/da(ix,iy,3)<db(ix,iy,2)/da(ix,iy,2))&(db(ix,iy,2)/da(ix,iy,2)<db(ix,iy,1)/da(ix,iy,1))
                                if abs(da(ix,iy,1)/(da(ix,iy,1)+da(ix,iy,2)+da(ix,iy,3))-db(ix,iy,1)/(db(ix,iy,1)+db(ix,iy,2)+db(ix,iy,3)))<0.129
                                    if abs(da(ix,iy,2)/(da(ix,iy,1)+da(ix,iy,2)+da(ix,iy,3))-db(ix,iy,2)/(db(ix,iy,1)+db(ix,iy,2)+db(ix,iy,3)))<0.028
                                        if abs(da(ix,iy,3)/(da(ix,iy,1)+da(ix,iy,2)+da(ix,iy,3))-db(ix,iy,3)/(db(ix,iy,1)+db(ix,iy,2)+db(ix,iy,3)))<0.143
                                            r(ix,iy)=0;
                                            h(ix,iy,1)=255;
                                            h(ix,iy,2)=255;
                                            h(ix,iy,3)=255;
                                        end
                                    end
                                end
                            end
                        end
                    end
                end                    
            end
        end
    end
end
imshow(h);
im=h-a;
imshow(im);`

因为我想识别前景图像中的阴影,所以我对前景图像和背景图像应用了相同的代码。

我使用了以下代码,但在我的情况下无法识别阴影。 我无法获得您在此处看到的阴影有人能建议我如何检测和消除前景图像中的阴影吗?

我的代码:

a=imread('C:\Users\PDCA 1\Desktop\Input images\case1\materialleft_mat1.jpg');
b=imread('C:\Users\PDCA 1\Desktop\Input images\case1\backgroundleft_mat1.jpg');
da=double(a);
db=double(b);
D=imabsdiff(a,b);             
N=size(D,1);
M=size(D,2);
r=zeros(N,M);
h=a;

for ix=1:N

    for iy=1:M

        if D(ix,iy)>20

              if da(ix,iy,1)~=0&da(ix,iy,2)~=0&da(ix,iy,3)~=0
                if (db(ix,iy,1)/da(ix,iy,1)<4)&(db(ix,iy,1)/da(ix,iy,1)>1.5)
                    if (db(ix,iy,2)/da(ix,iy,2)<2.8)&(db(ix,iy,2)/da(ix,iy,2)>1.3)
                        if (db(ix,iy,3)/da(ix,iy,3)<2.05)&(db(ix,iy,3)/da(ix,iy,3)>1.14)
                            if (db(ix,iy,3)/da(ix,iy,3)<db(ix,iy,1)/da(ix,iy,1))&(db(ix,iy,3)/da(ix,iy,3)<db(ix,iy,2)/da(ix,iy,2))&(db(ix,iy,2)/da(ix,iy,2)<db(ix,iy,1)/da(ix,iy,1))
                                if abs(da(ix,iy,1)/(da(ix,iy,1)+da(ix,iy,2)+da(ix,iy,3))-db(ix,iy,1)/(db(ix,iy,1)+db(ix,iy,2)+db(ix,iy,3)))<0.129
                                    if abs(da(ix,iy,2)/(da(ix,iy,1)+da(ix,iy,2)+da(ix,iy,3))-db(ix,iy,2)/(db(ix,iy,1)+db(ix,iy,2)+db(ix,iy,3)))<0.028
                                        if abs(da(ix,iy,3)/(da(ix,iy,1)+da(ix,iy,2)+da(ix,iy,3))-db(ix,iy,3)/(db(ix,iy,1)+db(ix,iy,2)+db(ix,iy,3)))<0.143
                                            r(ix,iy)=0;
                                            h(ix,iy,1)=255;
                                            h(ix,iy,2)=255;
                                            h(ix,iy,3)=255;
                                        end
                                    end
                                end
                            end
                        end
                    end
                end                    
            end
        end
    end
end
imshow(h);
im=h-a;
imshow(im);`

结果完全错误。为我的图像识别的阴影根本不正确。

并且错误的阴影被给出为

谁能告诉我我在哪里犯了错误以及如何识别我的一组图像的阴影?

编辑:我还尝试将两个图像都转换为 HSV 并减去两个图像的色调分量以消除阴影,但不幸的是它会导致背景中的噪音更强。

代码如下:

fg = im2double(imread('foregroundimage.jpg'));

bg=im2double(imread(backgroundimage.jpg));

fg=rgb2hsv(fg);
bg=rgb2hsv(bg); 
f1=fg(:,:,1);

f2=bg(:,:,1);

workpiece=imabsdiff(f1,f2);

imshow(workpiece);

这是我从 HSV 转换和随后减去色调分量获得的输出。(如您所见,)背景噪音没有完全消除。所以有人帮我消除背景噪音,只得到工件。 非常感谢任何帮助。在此先感谢。

再次感谢。

【问题讨论】:

  • 唷。最重要的是:if A, if B, if C, if D, ... end end end 可以简化为:if A &amp;&amp; B &amp;&amp; C &amp;&amp; D, ... end。
  • OMG 那个代码。所有这些 if 都需要像这样嵌套吗?
  • 这应该等同于您的代码:ideone.com/2Xbqbk 了解逻辑索引。这使事情更容易阅读。
  • 您编写的代码可能是我见过的使用if 语句最多的代码之一。请利用逻辑索引和矢量化。
  • 此外,我们没有人可以评论代码的“错误”,因为我们不知道它应该做什么以及它是如何工作的。我们当然是来帮助你的,但你必须给我们更多。简单的代码转储并期望我们修复它不是我们在这里所做的。如果您可以提供关于如何在更高级别上移除阴影的概要,我们或许能够提供一些关于在何处提出更正建议的见解。我现在告诉你,不会有很多人(包括我)会在当前状态下跟踪你的代码并告诉你要纠正什么。

标签: image matlab image-processing shadow image-segmentation


【解决方案1】:

第一个“if”选择与背景显着不同的像素。 代码中的第二个“if”可能是出于技术问题 - (0,0,0) 的像素通常是由于相机或成像过程中的缺陷造成的。 第3、4、5个'if'搜索红、绿、蓝与相应背景值有一定比例的像素。例如

db(ix,iy,1)/da(ix,iy,1)<4)&(db(ix,iy,1)/da(ix,iy,1)>1.5

表示像素的红色值比相应前景像素的红色通道小 1.5 到 4 倍。绿色比例2.8-1.3,蓝色比例1.14-2.05。

图像中存在这种比率的原因是像素的颜色可以通过乘以物体在某个通道中的反射,乘以该通道中光源的强度来估计。这个假设并不总是准确的,因为光谱实际上是连续的,而不仅仅是 RGB,但它对于许多用途来说已经足够好了。很容易看出,如果你采用这个假设,那么每个通道的阴影像素与背景像素的比率应该是恒定的。

这 3 个 if 的值适用于特定的光照条件,尤其是明亮的白天条件,因为蓝色通道的较低乘数表示蓝天。另一方面,您的图像似乎是在人造光下拍摄的。在这些条件下,乘数可能要小得多,并且跨通道均匀。

至于其他条件,很难说诗人的目的是什么。我猜他们使用 r/g/b 比例来获得良好的图像效果。

我给你的建议是从类似于条件 1、3-5 的东西开始,并为它们找到合适的常数。我会从所有通道的相同限制开始,因为照明似乎是室内且均匀的。 但是不要这样写 Matlab 代码! Matlab 代码应该使用矩阵,而不是标量!例如

 shadow = im < bg-20;
 shadow = shadow & im(:,:,1)*4 < bg(:,:,1) & im(:,:,1)*1.5 > bg(:,:,1) ;

等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2020-10-25
    • 2023-03-21
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多