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