首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当有前景和背景的图像时,如何检测和消除阴影?

当有前景和背景的图像时,如何检测和消除阴影?
EN

Stack Overflow用户
提问于 2015-03-15 02:08:53
回答 1查看 745关注 0票数 1

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

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

上述操作的代码为:

代码语言:javascript
运行
复制
`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);`

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

我使用了以下代码,但无法识别我的案例中的阴影。我不能得到你在这里看到的阴影,有人能建议我如何从前景图像中检测和消除阴影吗?

我的代码:

代码语言:javascript
运行
复制
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);`

结果完全是为我的图像识别的wrong.The阴影根本不正确。

错误的阴影如下所示

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

编辑:我也尝试将两张图片转换为HSV,并减去两张图片的色调分量以去除阴影,但不幸的是,这会导致背景中出现更强的噪声。

代码如下:

代码语言:javascript
运行
复制
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转换和色调分量的减法得到的输出。(如你所见,)

背景噪声没有完全消除。所以有人能帮我消除背景噪音,只得到工件。任何帮助都是提前appreciated.Thanks的。

再次感谢。

EN

回答 1

Stack Overflow用户

发布于 2015-03-16 00:36:06

第一个'if‘选择与背景明显不同的像素。代码中的第二个'if‘可能是为了技术问题-像素(0,0,0)通常是由于相机或成像过程中的缺陷。第三、第四和第五个if搜索其红、绿和蓝在相应背景值中具有一定比例的像素。例如

代码语言:javascript
运行
复制
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个of的值适用于特定的灯光条件,特别是晴朗的白天条件,因为蓝色通道的较低倍数表示蓝天。另一方面,你的图像似乎是在人造光中拍摄的。在这些条件下,乘法器可能要小得多,并且跨通道均匀。

至于其他情况,很难说诗人的目的是什么。我猜他们玩r/g/b的比例是为了给他们的图像带来好的效果。

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

代码语言:javascript
运行
复制
 shadow = im < bg-20;
 shadow = shadow & im(:,:,1)*4 < bg(:,:,1) & im(:,:,1)*1.5 > bg(:,:,1) ;

等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29052385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档