2015-06-25 13 views
3

我正在使用scikit-image来检测图像上的某些区域。我能够使用blob_doh函数检测斑点。此外,我能够使用Canny edge detector和标签找到区域。Python:如何使用`numpy.all`和`numpy.any`检查数组是否包含在另一个数组中?

现在我想检查一下我之前找到的斑点是否位于这些区域内部,并对那些不在任何区域中的斑点进行分类。然后,我只想绘制区域内的斑点。

我试图实现这个使用numpy.allnumpy.any但我可能误解了这些函数的工作方式。这是我有:

for region in regions: 
    # list of pixels' coords in a region 
    pixel_array = region.coords 

    # check if a blob is inside the region 
    for blob in blobs_doh: 
     y, x, r = blob 

     if np.any(pixel_array == [x, y]): 
      c = plt.Circle((x, y), r, color='red', linewidth=1, fill=False) 
      minr, minc, maxr, maxc = region.bbox 
      rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr, fill=False, edgecolor='lime', linewidth=1) 
      # draw blobs and regtangles 
      ax.add_patch(c) 
      ax.add_patch(rect) 
      break 

所以,我做了什么。 region是形状为[[a1, b1], [a2, b2], [a3, b3], ..., [an, bn]]的阵列,并且blob是形状为[c, d]的阵列。我的想法是检查region中是否有任何等于blob的子阵列。我当然可以通过循环搜索来做到这一点,但我认为这样做更有效,并试图使用numpy.allnumpy.any。不幸的是,我无法正常工作。行np.any(pixel_array == [x, y])仅检查blob的第一个元素,但不检查整个子阵列[x, y]。我也试过的.any.all不同组合使用axis说法:

np.any(pixel_array == [x, y], axis = 1).all(axis = 0) 

,但不能得到任何满意的结果。

请帮我完成此任务。执行这种检查的更好方法是什么?

谢谢。

+1

看一看http://stackoverflow.com/a/15068334/2375207 – nicolallias

回答

0

如果将pixel_array转换为列表,则可以执行此操作。不知道如何高效的那会,但这个工程:

if [x,y] in pixel_array.tolist(): 

编辑:

看起来像有人已经超时很多不同的选择in this answer。上述tolist()解决方案是不是太糟糕,但在一定范围内的情况下最好的选择似乎是:

if any(np.equal(pixel_array,[x,y]).all(1)): 
相关问题