0

我对 Matlab 很陌生,必须为实验室做一些工作。基本上我必须计算图像中人物的高度。我已经确定的人旁边有一些标记。所以现在我现在将图像转换为二进制图像:在此处输入图像描述

我需要图片中每个人的 x 和 y 位置来将其与我已经找到的标记进行比较。如果我已经在该坐标附近找到了一个人,我尝试遍历图像并检查周围环境,但它不起作用,也不是非常“类似于 matlab”。(由于循环,性能也很差)

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

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

4

1 回答 1

1

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

首先,反转图像,使人为白色,背景为黑色。求所有行的总和。

data = sum(im);

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

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;

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

于 2012-11-28T21:06:28.083 回答