如何使用opencv定位热图中的红色区域?

zzlelutf  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(190)

我正在使用异常检测框架生成一个热图,输出类似于此图像。
输出如下所示:

如何在原始图像上标记红色区域?例如在原始图像的红色部分周围画一个圆圈。

yv5phkfx

yv5phkfx1#

假设您有这个热图。

它实际上是由一些强度数据生成的,一些prediction,你从你的算法中获得的。这是我们需要的,而不是热图本身。它通常是一个“灰度图像”,它没有颜色,只有强度值。通常它是从0.0到1.0(也可以是从0到255),如果你要绘制它,它会这样。

所以现在要获得“红色”区域,你只需要高强度的区域,我们必须做“阈值”来获得它们。

max_val = 1.0             # could be 255 in your case, you must check
prediction /= max_val     # normalize
mask = prediction > 0.9

阈值在这种情况下是0.9,你可以使它更小,使“红色”区域更大。我们将得到以下掩码:

现在,我们可以将此遮罩与原始图像混合:

alpha = 0.5    
original[mask] = original[mask] * (1 - alpha) + np.array([0, 0, 255]) * alpha

......还有这个:

或者,我们可以在遮罩上找到一些轮廓并将其圈起来:

contours, _ = cv2.findContours(mask.astype(np.uint8), 
                               cv2.RETR_EXTERNAL, 
                               cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    center = np.average(cnt, axis=0)
    radius = np.max(np.linalg.norm((cnt - center)[:, 0], axis=1))
    radius = max(radius, 10.0)
    cv2.circle(original, center[0].astype(np.int32), int(radius), (0, 0, 255), 2)

...以获取此信息:


指令集

相关问题