我正在使用异常检测框架生成一个热图,输出类似于此图像。输出如下所示:
如何在原始图像上标记红色区域?例如在原始图像的红色部分周围画一个圆圈。
yv5phkfx1#
假设您有这个热图。
它实际上是由一些强度数据生成的,一些prediction,你从你的算法中获得的。这是我们需要的,而不是热图本身。它通常是一个“灰度图像”,它没有颜色,只有强度值。通常它是从0.0到1.0(也可以是从0到255),如果你要绘制它,它会这样。
prediction
所以现在要获得“红色”区域,你只需要高强度的区域,我们必须做“阈值”来获得它们。
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)
...以获取此信息:
指令集
1条答案
按热度按时间yv5phkfx1#
假设您有这个热图。
它实际上是由一些强度数据生成的,一些
prediction
,你从你的算法中获得的。这是我们需要的,而不是热图本身。它通常是一个“灰度图像”,它没有颜色,只有强度值。通常它是从0.0到1.0(也可以是从0到255),如果你要绘制它,它会这样。所以现在要获得“红色”区域,你只需要高强度的区域,我们必须做“阈值”来获得它们。
阈值在这种情况下是0.9,你可以使它更小,使“红色”区域更大。我们将得到以下掩码:
现在,我们可以将此遮罩与原始图像混合:
......还有这个:
或者,我们可以在遮罩上找到一些轮廓并将其圈起来:
...以获取此信息:
指令集