首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取热图上“最热区域”的坐标

获取热图上“最热区域”的坐标
EN

Stack Overflow用户
提问于 2017-10-14 21:30:17
回答 2查看 1.6K关注 0票数 3

我有一个形状(600,400)的热图数字阵列。热图表示探测的概率。在我的例子中,在图像中人脸检测的概率。我的目标是获取这个热图,得到最大概率出现的坐标(X和Y)。

我已经解决了这个单脸的案子。这方面的代码如下:

代码语言:javascript
复制
face_location = np.unravel_index(heatmap.argmax(), heatmap.shape)
    print("Face location: " + str(face_location))

但在某些情况下,有多个面孔。我不知道如何调整算法返回多个“最热区域”。问题是,任何一个热点地区都会被逐渐较少的热区所包围。所以,在最热的区域之后,下一个前十名可能就在起始点附近。

如何调整算法寻找多个热点区域?可以假设他们不会就在一起。

代码语言:javascript
复制
heatmap = [[  2.00299415e-04   2.03753079e-04   8.17560707e-04 ...,   2.23556344e-04
         1.98958180e-04   9.92935777e-01]
      [  2.00642273e-04   2.04473894e-04   8.19963054e-04 ...,   2.24148811e-04
         1.99438742e-04   9.92921114e-01]
      [  2.01056406e-04   2.05344462e-04   8.22864589e-04 ...,   2.24864416e-04
         2.00019145e-04   9.92903233e-01]
      ..., 
      [  7.28193991e-05  -2.73474743e-05   2.95096161e-05 ...,   5.96550672e-05
         1.98282614e-05   9.99637246e-01]
      [  7.34055429e-05  -2.72389279e-05   3.02382941e-05 ...,   5.98490733e-05
         2.04356711e-05   9.99619305e-01]
      [  7.37556256e-05  -2.71740992e-05   3.06735128e-05 ...,   5.99649393e-05
         2.07984649e-05   9.99608397e-01]]
EN

回答 2

Stack Overflow用户

发布于 2017-10-15 02:25:51

也许可以考虑使用具有阈值概率的掩模阵列来定义热点区域?

代码语言:javascript
复制
In [29]: threshold_probability = 0.8

In [30]: prng = np.random.RandomState(42)

In [31]: heatmap = prng.rand(600, 400)

In [32]: heatmap
Out[32]: 
array([[ 0.37454012,  0.95071431,  0.73199394, ...,  0.42899403,
         0.75087107,  0.75454287],
       [ 0.10312387,  0.90255291,  0.50525237, ...,  0.56513318,
         0.69665082,  0.92249938],
       [ 0.70723863,  0.15253904,  0.57628836, ...,  0.96887786,
         0.74965183,  0.13008624],
       ..., 
       [ 0.77669933,  0.98757844,  0.72686576, ...,  0.149866  ,
         0.6685433 ,  0.90248875],
       [ 0.116007  ,  0.96352904,  0.33109138, ...,  0.85776718,
         0.88838363,  0.00901272],
       [ 0.30810176,  0.43190563,  0.60935151, ...,  0.07498895,
         0.60716006,  0.31712892]])

In [33]: hottest_areas = np.ma.MaskedArray(heatmap, heatmap < threshold_probability)

In [34]: X, Y = hottest_areas.nonzero()

In [35]: X
Out[35]: array([  0,   0,   0, ..., 599, 599, 599])

In [36]: Y
Out[36]: array([  1,   7,  11, ..., 376, 388, 394])

结果是包含定义掩码的布尔条件为False (即面概率高于阈值的区域)的值的x和y同弦的元组。

票数 0
EN

Stack Overflow用户

发布于 2017-10-19 09:16:27

如果你想像达维德普提议的那样有一个门槛,我有一个不同的方法来提议。不要查找非零元素,只需查找二进制映像的connexe组件即可。

代码语言:javascript
复制
import numpy as np
from scipy.ndimage.measurements import label
from skimage.measure import regionprops

heatmap = np.random.rand(100, 25)

thresh = 0.9
bw = np.array(heatmap)
bw[bw < thresh] = 0

img_cc, nb_cc = label(bw)
cc = regionprops(img_cc)

face_location = np.array([c.centroid for c in cc])

import matplotlib.pyplot as plt

plt.figure()
plt.imshow(heatmap)
plt.plot(face_location[:, 1], face_location[:, 0], 'r*')

plt.figure()
plt.imshow(img_cc)
plt.plot(face_location[:, 1], face_location[:, 0], 'r*')

plt.show()

脸的位置在这里由connexe组件的中心定义,但是您可以找出图像中每个区域的最大值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46749526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档