获得准确的热力图是一个非常棘手的问题,因为热力图与不同透明级别的叠加。这意味着每个像素存在两个未知数:
1. 热力图本身
2. 透明度(它们是相关的,但精确映射是未知的)
如果只需要一个大致的分割,我建议通过颜色强度进行简单的阈值处理。您可以看到,热力图的强区域被强烈的蓝色所包围。
I = imread('https://istack.dev59.com/7oVZK.webp');
mask1 = I(:,:,3) > 230 & I(:,:,1) < 30 & I(:,:,2) < 10;
现在我们扩大掩码以关闭蓝色热图边界中的任何空洞并填充这些空洞。
mask2 = imdilate(mask1, strel('disk',5,0));
mask2 = imfill(mask2, 'holes');
最后,我们可以提取热力图:
heat_map = I;
heat_map(~repmat(mask2,[1 1 3])) = 255;
imshow(heat_map)
这里是
结果
![enter image description here](https://istack.dev59.com/iiEW0.webp)
编辑:如果你需要处理许多类似的图像,那么在hsv空间中执行分割可能更加稳健。
I_hsv = rgb2hsv(I);
mask1 = I_hsv(:,:,1) > 0.6 & I_hsv(:,:,1) < 0.7 & I_hsv(:,:,2) > 0.95 & I_hsv(:,:,3) > 0.9;