-->

简单的物体识别(Simple object recognition)

2019-07-18 15:01发布

===解决===

感谢您的建议和意见。 通过在给出的flood_fill算法工作的开始Python的可视化书(第9章-图像处理),我已经实现了我一直想。 我可以指望的对象,获得包围矩形为每个对象(因此高度和宽度),并且最后可以构建NumPy的阵列或矩阵为它们中的每。

虽然它不是一种优化方法是我想要做什么。 源代码(lab2.py)和PNG文件(实验2-particles.png),我使用已经划归http://code.google.com/p/ccnworks/source/browse/#svn/trunk/AtSc450 。

您需要安装与NumPy和PIL,并matplotlib看直方图。 代码的核心在于其中的主要对象递归搜索行动发生objfind函数中。

一个进一步的更新:

SciPy的的ndimage.label()不正是我想要的东西了。

干杯的大卫-沃德·法利扎卡里平从与NumPy和SciPy的邮件列表指出这直接进入我的眼睛:)

=============

你好,

我有一个包含由粒子光谱仪测量冰颗粒的阴影的图像。 我希望能够识别每一个对象,这样我可以在以后进行分类,并在我的计算进一步使用它们。

在本质上,我愿意做的就是实现一个模糊选择工具,在那里我可以简单地选择每一个实体。

我怎么能轻松地解决这个问题呢? (优选地,使用Python)

谢谢。

注:在我的问题,我指的是每一个具体的连接像素作为对象或实体。 我打算提取出来,并创建NumPy的阵列表示,如下图所示。 (在这里,我使用左上对象;如果像素存在使用1起的如果不使用0的该对象的形状是3×3,其相应地3像素高度由3像素宽度这些都是真实的冰颗粒的投影到2D域。 ,其为球形和等效半径的假设下是(高度+宽度)/ 2,和后来一些定标--from像素实际尺寸和体积计算将遵循)

import numpy as np

np.array([[1,1,1], [1,1,1], [0,0,1]])

array([[1, 1, 1],
       [1, 1, 1],
       [0, 0, 1]])

下面是从我要使用图像的部分。

截图http://img43.imageshack.us/img43/2327/particles.png

Answer 1:

  1. 扫描每平方(例如,从左上角,左到右,上到下的)

  2. 当你打一个蓝色正方形,则:

    一个。 记录这个广场作为新对象的位置

    湾 发现所有其它的连续蓝色正方形(例如,通过看这个广场的邻居,这些邻居的邻居,等等),它们标记为同一对象的一部分

  3. 继续扫描

  4. 当你发现另一个蓝色方块,测试,看看它是否才去步骤2已知物体的一部分; 或者在步骤2b,删除任何平方你与对象相关联后,



Answer 2:

我以前做的显微照片这样的分析,并最终把我需要为C语言编写的图像处理和分析包,通过Tcl驱动一切。 (它的工作具有512×512个仅适用于图像,这可以解释为什么512种庄稼了这么频繁。有与分配的各种尺寸的像素的图像,但大多数与8位像素所做的工作,这也解释了为什么有一种生意的254的图像上0xFF和最大有意义计数)。

简要地说,“ZZ”在Tcl命令的开头发送的线到封装的解析器,调用与所述给定参数的适当的C程序的其余部分。 所述“ZZ”后右是指示命令的输入和输出参数。 (可以有多个输入,但仅单个输出。)“R”表示一个512×512×8位图像。 第三字是要调用的命令的名称; “图形”标记了一个图像作为在下面的文本中描述。 所以,“ZZ RR图”手段“调用ZZ解析器; 输入R图像的图形命令,并取回R图像“。 Tcl的命令行的其余部分指定要使用哪个预分配的图像。 (在“G”图像是ROI,即,区域的感兴趣,图像;几乎所有ZZ OPS被ROI控制下进行)所以,“R1 R1 G8”是指“使用R 1作为输入,使用R1作为输出(也就是说,标记输入图像本身),然后执行操作的地方使图像G8的对应像素---即,R8,用作ROI ---> 0。

我不认为这是可在网上的任何地方,但如果你想通过源代码来接,甚至不能编译整个事情,我会很乐意将其发送给您。 下面是手动的摘录(但我想我看到手册中的一些错误,在这么晚的日期---这是令人尴尬...):

实施例6.计数功能。

问题

计数的共同任务。 计算的项目被称为“功能”,它通常是需要认真准备的图像,这样的功能在一比一的方式,很多东西都被算作真正的对象对应。 然而在这里,我们忽略图像的准备和考虑,而是计数的机制。 第一个计数练习是找出有多少功能是在目录./cells的图像?

途径

首先,让我们定义的“功能”。 一个特点是“设置”最大的群体(不为零)像素,所有的可以通过一个像素旅行到另一个沿南北东西(上下,左右)的路线,出发到达从一组给定像素。 即在图像上检测并标记这些特征的ZZ命令是“ZZ RR图表R:SRC R:DEST G:ROI”,这样称呼是因为对于这样的特征的数学术语是“图”。 如果图像上的所有像素被设置,那么就只有在图像上的单个曲线图,但它包含262144个像素(512×512)。 如果像素被设置,并在棋盘图案清晰(等于零),则会有131072(512×512/2)的曲线图,但每个将仅含有一个像素。 简要解释,“ZZ RR图”开始在图像的左上角和扫描从左到右每个后续行,直到找到一组像素,然后发现全部通过北连接到该组像素,南,东,或西边界(“4-连接”)。 然后,它设置在该图中的所有像素为1(0×01)。 发现和标识图1后,再次开始在像素的一个地方首先发现图1后扫描,这一次忽略了已经属于一个图中的任何像素。 第一254个的图表,它找到将被唯一标示; 之后找到的所有的图形,但是,将与值255(0xff的)标记的,所以不能从彼此区分。 在能够准确地计算任何数量的曲线图的关键是处理在阶段的每个图像,即,找到的图像图形的数目,并且如果数量是大于254,擦除254个图表刚刚发现,重复过程,直到254个或更少的图形被找到。 TCL语言提供了设置这一操作的控制手段。

让我们开始构建通过读取ZZ图像文件转换为R图像,并检测和标记的曲线所需的命令。 处理循环之前,我们声明和零一个变量来保存的图像序列的特征的总数。 内的处理循环中,我们首先读取图像文件转换为R图像,并检测和标记的曲线图。

zz ur to $inDir/$img r1
zz rr graphs r1 r1 g8

接下来,我们零一些变量来跟踪计数,然后使用“RA最大”命令来查看是否检测到超过254个图表。

set nGraphs [ zz ra max r1 a1 g1 ]

如果nGraphs确实等于255,那么254个高精度地计数图表应该被添加到总的,从1到254的曲线应该被擦除,并重复多次计数,因为它需要降低至低于255图形的数目。

while {$nGraphs == 255} {
  incr sumGraphs 254
  zz rbr lt r1 155 r1 g1 0 255 
  set sumGraphs 0
  zz rr graphs r1 r1 g8
  set nGraphs [ zz ra max r1 a1 g8 ]
}

当“while”循环退出时,可变nGraphs必须持有大于255以下的数,也就是一个数准确计数的图表; 这被添加到总上升在图像系列特征的数量的。

incr sumGraphs $nGraphs

处理循环后,打印出的该系列中的特征的总数。

puts “Total number of features in $inDir \
images $beginImg through $endImg is $sumGraphs.”

处理循环后,打印出的该系列中的特征的总数。



Answer 3:

看着您提供的图片,你下一步需要做的是应用一个简单的区域生长算法 。

如果我使用MATLAB,我会用bwlabel / bwboundaries功能。 我相信,在某处numpy的是一个等效的功能,或者使用与OpenCV的 Python包装由@kwatford的建议



Answer 4:

OpenCV的有一个Python接口,你可能会发现有用。



Answer 5:

连接成分分析可能是你在找什么。



文章来源: Simple object recognition