使用C++从不同大小的blob生成HeatMap

Anu*_*tgi 4 c++ opencv heatmap

我想从附图获得热图.较大的斑点将具有较暗(红色)区域,然后慢慢淡化为较浅的蓝色色调.较小的斑点将具有较轻的变化.但请记住,较大斑点的中心应该是最热的地区.我认为使用高斯模糊和阈值处理可以使斑点更加曲线美.

我使用opencvs方法,比如使用距离变换,然后使用apply colormap.但这感觉就像它更像是倒圆形,如骷髅(变薄)的斑点.我想要一个更好的梯度热图.

在此输入图像描述

我希望它更像 在此输入图像描述

不像opencv那样在此输入图像描述

Bal*_*i R 8

您只需循环浏览单个blob即可找到Individual blob Color Map.这是一个示例实现.您可以根据需要使用任何颜色映射.希望这可以帮助!

Mat mSource_Gray,mBlobHeatMap,mHeatMap;
mSource_Gray= imread(FileName_S.c_str(),0);

//Just making sure everything is binary
threshold(mSource_Gray,mSource_Gray,254,255,THRESH_BINARY);
imshow("Source Image",mSource_Gray);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

//Finding Distance Transform
Mat mDist,mBlobDist;
distanceTransform(mSource_Gray, mDist, CV_DIST_L2, 3);
normalize(mDist, mDist, 0, 1., cv::NORM_MINMAX);
mDist.convertTo(mDist,CV_8UC1,255,0);
imshow("mDist",mDist);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
/// Find contours to Mask out the Individual Contours
findContours( mSource_Gray, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0) );
/// Draw contours (Mask)
Mat mBlobMask = Mat::zeros( mSource_Gray.size(), CV_8UC1 );
for( size_t i = 0; i< contours.size(); i++ )
{
    drawContours( mBlobMask, contours, (int)i, Scalar(255), -1);
    mDist.copyTo(mBlobDist,mBlobMask);
    applyColorMap(mBlobDist,mBlobHeatMap,COLORMAP_JET);
    GaussianBlur(mBlobHeatMap,mBlobHeatMap,Size(21,21),0,0);
    mBlobHeatMap.copyTo(mHeatMap,mBlobMask);
}

imshow("mHeatMap",mHeatMap);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述