如何定位特定的“区域"二维 numpy 数组中的值? [英] How to locate a particular "region" of values in a 2D numpy array?

查看:28
本文介绍了如何定位特定的“区域"二维 numpy 数组中的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用由 101x101=10201 值组成的二维 numpy 数组.这些值属于 float 类型,范围从 0.01.0.该数组有一个 X,Y 坐标系,它起源于左上角:因此,位置 (0,0) 在左上角,而位置 >(101,101) 在右下角.

这是二维数组的样子(只是摘录):

X,Y,Value0,0,0.4820,1,0.490,2,0.4960,3,0.4950,4,0.490,5,0.4890,6,0.50,7,0.5040,8,0.4940,9,0.485

我希望能够:

1) 计算值超过给定阈值的单元格区域的数量(见下图),例如 0.3;

2) 确定这些区域的视觉中心到左上角的距离,坐标为(0,0).

如何在 Python 2.7 中做到这一点?

这是一个 2D 数组的视觉表示,其中突出显示了 2 个区域(颜色越深,值越高):

解决方案

您可以使用简单的布尔条件找到哪些像素满足您的截止值,然后使用

I am working with a 2D numpy array made of 101x101=10201 values. Such values are of float type and range from 0.0 to 1.0. The array has an X,Y coordinate system which originates in the top left corner: thus, position (0,0) is in the top left corner, while position (101,101) is in the bottom right corner.

This is how the 2D array looks like (just an excerpt):

X,Y,Value
0,0,0.482
0,1,0.49
0,2,0.496
0,3,0.495
0,4,0.49
0,5,0.489
0,6,0.5
0,7,0.504
0,8,0.494
0,9,0.485

I would like to be able to:

1) Count the number of regions of cells (see image below) which value exceeds a given threshold, say 0.3;

2) Determine the distance between the visual centers of such regions and the top left corner, which has coordinates (0,0).

How could this be done in Python 2.7?

This is a visual representation of a 2D array with 2 regions highlighted (the darker the color, the higher the value):

解决方案

You can find which pixels satisfy your cut-off using a simple boolean condition, then use scipy.ndimage.label and scipy.ndimage.center_of_mass to find the connected regions and compute their centers of mass:

import numpy as np
from scipy import ndimage
from matplotlib import pyplot as plt

# generate some lowpass-filtered noise as a test image
gen = np.random.RandomState(0)
img = gen.poisson(2, size=(512, 512))
img = ndimage.gaussian_filter(img.astype(np.double), (30, 30))
img -= img.min()
img /= img.max()

# use a boolean condition to find where pixel values are > 0.75
blobs = img > 0.75

# label connected regions that satisfy this condition
labels, nlabels = ndimage.label(blobs)

# find their centres of mass. in this case I'm weighting by the pixel values in
# `img`, but you could also pass the boolean values in `blobs` to compute the
# unweighted centroids.
r, c = np.vstack(ndimage.center_of_mass(img, labels, np.arange(nlabels) + 1)).T

# find their distances from the top-left corner
d = np.sqrt(r*r + c*c)

# plot
fig, ax = plt.subplots(1, 2, sharex=True, sharey=True, figsize=(10, 5))
ax[0].imshow(img)
ax[1].hold(True)
ax[1].imshow(np.ma.masked_array(labels, ~blobs), cmap=plt.cm.rainbow)
for ri, ci, di in zip(r, c, d):
    ax[1].annotate('', xy=(0, 0), xytext=(ci, ri),
                   arrowprops={'arrowstyle':'<-', 'shrinkA':0})
    ax[1].annotate('d=%.1f' % di, xy=(ci, ri),  xytext=(0, -5),
                   textcoords='offset points', ha='center', va='top',
                   fontsize='x-large')
for aa in ax.flat:
    aa.set_axis_off()
fig.tight_layout()
plt.show()

这篇关于如何定位特定的“区域"二维 numpy 数组中的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆