【问题标题】:Matlab find Persons in Binary ImageMatlab在二值图像中查找人物
【发布时间】:2012-11-27 19:35:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你的笔记让我怀疑这是不是作业,如果是,那么它应该被标记为这样。
  • 你可以使用conv吗?
  • @slayton: homework 标签已被弃用。
  • 我想不出除了内置函数之外的任何其他方法(尽管您可以编写自己的转换和过滤器)。你只需要迭代。它很慢,但很有效。
  • @Bill 使用内置函数最简单的方法是什么。如果内置功能可以自己实现相对容易就好了。

标签: matlab image-processing octave


【解决方案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;

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

【讨论】:

  • 非常感谢比尔。我想我可以用这个很棒的提示来解决它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 2018-06-10
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多