我有前景和background.While的图像,我想从前景中减去背景,前景图像还包含我想要消除的工件的阴影。
我遇到过完成以下工作的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);`结果完全是为我的图像识别的wrong.The阴影根本不正确。

错误的阴影如下所示

谁能告诉我我在哪里犯了错,以及如何识别我的一组图像的阴影?
编辑:我也尝试将两张图片转换为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转换和色调分量的减法得到的输出。(如你所见,)

背景噪声没有完全消除。所以有人能帮我消除背景噪音,只得到工件。任何帮助都是提前appreciated.Thanks的。
再次感谢。
发布于 2015-03-16 00:36:06
第一个'if‘选择与背景明显不同的像素。代码中的第二个'if‘可能是为了技术问题-像素(0,0,0)通常是由于相机或成像过程中的缺陷。第三、第四和第五个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个of的值适用于特定的灯光条件,特别是晴朗的白天条件,因为蓝色通道的较低倍数表示蓝天。另一方面,你的图像似乎是在人造光中拍摄的。在这些条件下,乘法器可能要小得多,并且跨通道均匀。
至于其他情况,很难说诗人的目的是什么。我猜他们玩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) ;等。
https://stackoverflow.com/questions/29052385
复制相似问题