Matlab在二进制图像中找到人

时间:2012-11-27 19:35:33

标签: matlab image-processing octave

我是Matlab的新手,必须为实验室做一些工作。 基本上我必须计算图像中人物的高度。我已经确定的人旁边有一些标记。所以现在我现在将图像转换为二进制图像:enter image description here

我需要图片中每个人的x和y位置,以便将它与我已经找到的标记进行比较。 我试图迭代图像并检查周围环境,如果我已经在这个坐标附近找到了一个人但它不起作用,也不是非常“像matlab一样”。 (由于循环,性能也很糟糕)

注意:我不允许使用大多数“好的或复杂的”函数,例如imfilter ...(例如,我还必须将转换写入二进制图像)

我不知道应该如何解决这个问题(除了我上面描述的方法)。 我可以在这里发布我的代码,但我想这无助于回答这个问题。

1 个答案:

答案 0 :(得分:1)

如果您可以使用内置插件(或编写自己的内置插件),这就是我一直在考虑的部分解决方案。

首先,反转图像,使人们处于白色,背景为黑色。找到所有行的总和。

data = sum(im);

这将为您提供一些噪声数据,显示每行中的on像素数。如果你绘制它,峰值就是人,山谷就是它们之间的区域。但是会有很多错误的高峰。要解决此问题,请使用卷积,如:

data2 = conv(data,ones(1,50)/50,'same');

50的大小似乎运作良好。它可能因图像不同而有所不同,但如果它们或多或少与上面的相似,那么50应该有效。

现在你应该拥有一组干净的数据,显示人们所处的高峰(特别是人们的最高点)。您可以执行单个for循环来查找这些峰值。但是,在你越过山谷之前,不要开始寻找下一个峰值。如果它有帮助你可以使用导数来找到导数通过零的位置(这些是峰和谷)。

deriv = (data2(2:end)-data(1:end-1));

但是我发现导数上并不总是字面上的零点,所以你也会改为寻找符号变化。

还有一些公共功能可以下载以自动找到峰值。

因此,假设您将峰值存储在某些矢量峰值中。现在您知道了人的x位置,因此隔离列并找到第一个非零(人的头部和y位置的顶部),然后从总列大小中减去该列以找到高度。所以对于第一个高峰:

x = peaks[1];
y = find(im(:,x),1,'first');
height = size(im,1)-y;

我认为这些方面的某些内容可能对你有用。你仍然需要做一些迭代,但不是很多。