我是Matlab和图像处理的新手 . 我正在研究这样的图像中的背景和前景
我有这样的数百张图片,找到here . 通过反复试验,我发现了一个阈值(在RGB空间中):红色层始终小于150,绿色和蓝色层大于150,背景为 .
所以如果我的RGB图像是 I
而且我的 r
, g
和 b
层是
redMatrix = I(:,:,1);
greenMatrix = I(:,:,2);
blueMatrix = I(:,:,3);
通过查找红色,绿色和蓝色的坐标,其值大于或小于150我可以得到背景的坐标
[r1 c1] = find(redMatrix < 150);
[r2 c2] = find(greenMatrix > 150);
[r3 c3] = find(blueMatrix > 150);
现在我在 r1,c1,r2,c2,r3 and c3
中获得了数千个像素的坐标 .
My questions:
-
如何找到常用值,例如红色小于150且绿色和蓝色大于150的像素坐标?我必须迭代
r1
和c1
的每个坐标并检查它们是否出现在r2 c2
和r3 c3
中以检查它是否是一个常见点 . 但那将是非常昂贵的 . Can this be achieved without a loop ? -
如果我想出了像
[commonR commonC]
和commonR
和commonC
这两个共同点都是5000 X 1
的顺序,那么要访问ImageI
的这个背景像素,我必须首先访问commonR
然后commonC
然后访问图像I
就像
I(commonR(i,1),commonC(i,1))
那也很贵 . 所以我的问题是,这可以在没有循环的情况下完成 .
任何帮助,将不胜感激 .
I got solution with @Science_Fiction answer's
只是详细说明他/她的答案
我用了
mask = I(:,:,1) < 150 & I(:,:,2) > 150 & I(:,:,3) > 150;
2 回答
你的方法似乎基本但体面 . 因为对于这个特定的图像,背景主要由蓝色组成,所以你是粗糙的,并做:
这将设置那些评估为真的像素为> 150到0而false为1.您将拥有黑白图像 .
添加颜色
希望能给你带有纯白色背景的彩色图像 . 所有这些都需要一些试验和错误 .
不需要循环 . 你可以这样做:
灰度图像也足以分离背景 .
编辑
我又看了一眼,还使用了你链接到的其他图像 . 考虑到背景颜色的变化,我认为从图像直方图中获取阈值而不是硬编码会得到更好的结果 .
有时,这种算法有点严格,例如与背景一起擦除部分衣服 . 但我认为超过90%的图像分离得相当好,这比你希望用固定阈值实现的图像更强大 .
Results: