这期做了个可能有用的小工具,一般论文中热图很少给出数据,于是就想写个小工具通过热图上的颜色估计出数据值来,目前写了个初版的工具分享给大家!

工具函数

由于只是初版,要手动改的地方还是不少的,要设置好要提取数据的图片地址,结果存储地址,数据热图行数、列数以及colorbar的范围。

function getHeatmapData
% 要提取的图像地址
picPath='1.png';
% 提取结果存储路径
HMPath='data1.mat';
% 热图行数、列数
heatMapSize=[8,8];
% colorbar所表示范围
climColorbar=[-1,1];
% 提取colorbar上颜色点数量
pntNumColorBar=20;
% 数据计算所用点数(数值越大越精确)
pntNumInterp=1000;% figure窗口初始化
pic=imread(picPath);
figure()
ax=gca;hold on
ax.XLim=[0,size(pic,2)];
ax.YLim=[0,size(pic,1)];
imshow(pic)
% 绘制红蓝色点的句柄
baHdl=plot(ax,0,0,'b+','MarkerSize',12,'LineWidth',1.5);
rxHdl=plot(ax,0,0,'rx','MarkerSize',12,'LineWidth',1.5);
pntSet=zeros(0,2);
colorSet=zeros(4,3);
set(gcf,'WindowButtonDownFcn',@buttondown)function buttondown(~,~)xy=get(gca,'CurrentPoint');xp=xy(1,2);yp=xy(1,1);pos=[yp,xp];if strcmp(get(gcf,'SelectionType'),'normal')pntSet=[pntSet;pos];elseif size(pntSet,1)>0pntSet(end,:)=[];endpntSet=round(pntSet);pntSet(pntSet<1)=1;if size(pntSet,1)>4set(gcf,'WindowButtonDownFcn',[])saveColor();close allelse% 标记采样点位置和数值baHdl.XData=pntSet(:,1);baHdl.YData=pntSet(:,2);rxHdl.XData=pntSet(:,1);rxHdl.YData=pntSet(:,2);delete(findobj('type','text'))for i=1:size(pntSet,1)colorSet(i,:)=[pic(pntSet(i,2),pntSet(i,1),1),...pic(pntSet(i,2),pntSet(i,1),2),...pic(pntSet(i,2),pntSet(i,1),3)];text(ax,pntSet(i,1),pntSet(i,2),['    ',num2str(i),':[',num2str(colorSet(i,1)),',',...num2str(colorSet(i,2)),',',num2str(colorSet(i,3)),']'])endendendfunction saveColor(~,~)% 获取colorbar上颜色cbPntSet=pntSet(1:2,:);cbPntSetdiff=abs(cbPntSet(1,:)-cbPntSet(2,:));if cbPntSetdiff(1)>cbPntSetdiff(2)tPntSet=cbPntSet(1,1)+linspace(0,1,pntNumColorBar)'.*(cbPntSet(2,1)-cbPntSet(1,1));tPntSet=round(tPntSet);CMap=[pic(round((cbPntSet(1,2)+cbPntSet(2,2))/2),tPntSet,1)',...pic(round((cbPntSet(1,2)+cbPntSet(2,2))/2),tPntSet,2)',...pic(round((cbPntSet(1,2)+cbPntSet(2,2))/2),tPntSet,3)'];elsetPntSet=cbPntSet(1,2)+linspace(0,1,pntNumColorBar)'.*(cbPntSet(2,2)-cbPntSet(1,2));tPntSet=round(tPntSet);CMap=[pic(tPntSet,round((cbPntSet(1,1)+cbPntSet(2,1))/2),1),...pic(tPntSet,round((cbPntSet(1,1)+cbPntSet(2,1))/2),2),...pic(tPntSet,round((cbPntSet(1,1)+cbPntSet(2,1))/2),3)];endCMap=double(CMap);% -----------------------------------------------------------------% 提取heatmap上颜色hmPntSet=pntSet(3:4,:);hmXLim=[min(hmPntSet(:,1)),max(hmPntSet(:,1))];hmYLim=[min(hmPntSet(:,2)),max(hmPntSet(:,2))];YList=linspace(hmYLim(1),hmYLim(2),heatMapSize(1));XList=linspace(hmXLim(1),hmXLim(2),heatMapSize(2));[XMesh,YMesh]=meshgrid(round(XList),round(YList));CMesh=zeros(heatMapSize);for i=1:heatMapSize(1)for j=1:heatMapSize(2)CMesh(i,j,1)=pic(YMesh(i,j),XMesh(i,j),1);CMesh(i,j,2)=pic(YMesh(i,j),XMesh(i,j),2);CMesh(i,j,3)=pic(YMesh(i,j),XMesh(i,j),3);endend% 计算heatmap数值范围CMesh=double(CMesh);t1=linspace(climColorbar(1),climColorbar(2),pntNumColorBar)';t2=linspace(climColorbar(1),climColorbar(2),pntNumInterp)';CMapInterp=[interp1(t1,CMap(:,1),t2,'linear'),interp1(t1,CMap(:,2),t2,'linear'),interp1(t1,CMap(:,3),t2,'linear')];Data=zeros(heatMapSize);for i=1:heatMapSize(1)for j=1:heatMapSize(2)tRGB=[CMesh(i,j,1),CMesh(i,j,2),CMesh(i,j,3)];tnorm2=sum((CMapInterp-tRGB).^2,2);[ind,~]=find(tnorm2==min(tnorm2),1);Data(i,j)=t2(ind);endend% 存储数值
%         timestr=char(datetime('now'));
%         timestr(timestr==' ')='_';
%         timestr(timestr==':')='_';
%         nowStr=[timestr,'.mat'];CMapInterp=CMapInterp./255;CMap=CMap./255;save(HMPath,'Data','CMap','CMapInterp','climColorbar')end
end

基本使用

假设有这么一张图(压缩包内提供的示例图7)

要提取的数据8行8列,colorbar范围-1到1,因此将工具函数最前面的代码做出如此改动:

% 要提取的图像地址
picPath='7.png';
% 提取结果存储路径
HMPath='data7.mat';
% 热图行数、列数
heatMapSize=[8,8];
% colorbar所表示范围
climColorbar=[-1,1];
% 提取colorbar上颜色点数量
pntNumColorBar=20;
% 数据计算所用点数(数值越大越精确)
pntNumInterp=1000;

依次点击colorbar最小值处,最大值处,以及热图的对角线两个点处,之后随便点击图片任意处(共点击五次),就能将数据存储在mat文件中:

大概这样取四个点,并随便点击图像某处(若是点错了可鼠标右键撤回):

之后查看mat文件:

其中:

  • Data 提取的热图数据
  • CMap colormap
  • CMapInterp 插值后colormap
  • climColor colorbar范围

获取了这些数据后,可以很轻松的靠以下代码复刻出来图像:

HM=load('data7.mat');
HMHdl=heatmap(HM.Data);
colormap(HM.CMapInterp)
% 新版本可以将caxis换为clim
caxis(HM.climColorbar)% 不显示数值
HMHdl.CellLabelColor='none';

看起来提取的很完美,虽然肯定有误差,但是对于一般的论文复现已经足够了:


行列数不相同

几乎完全相同的处理手段,比如此图是15行20列,colorbar范围是-0.6到0.8,将最前面的代码修改为:

% 要提取的图像地址
picPath='6.png';
% 提取结果存储路径
HMPath='data6.mat';
% 热图行数、列数
heatMapSize=[15,20];
% colorbar所表示范围
climColorbar=[-.6,.8];
% 提取colorbar上颜色点数量
pntNumColorBar=20;
% 数据计算所用点数(数值越大越精确)
pntNumInterp=1000;

运行后进行取点:

之后还是运行绘图代码:

HM=load('data6.mat');
HMHdl=heatmap(HM.Data);
colormap(HM.CMapInterp)
% 新版本可以将caxis换为clim
caxis(HM.climColorbar)% 不显示数值
HMHdl.CellLabelColor='none';

数据提取结果:


非方形色块热图

依旧依据热图性质修改一下参数:

% 要提取的图像地址
picPath='4.png';
% 提取结果存储路径
HMPath='data4.mat';
% 热图行数、列数
heatMapSize=[11,11];
% colorbar所表示范围
climColorbar=[-1,1];
% 提取colorbar上颜色点数量
pntNumColorBar=20;
% 数据计算所用点数(数值越大越精确)
pntNumInterp=1000;

这种圆点形状的尽量要取点时取在正中央

数据提取结果:


色块上有文本

依旧依据热图性质修改一下参数:

% 要提取的图像地址
picPath='8.png';
% 提取结果存储路径
HMPath='data8.mat';
% 热图行数、列数
heatMapSize=[8,8];
% colorbar所表示范围
climColorbar=[-1,1];
% 提取colorbar上颜色点数量
pntNumColorBar=20;
% 数据计算所用点数(数值越大越精确)
pntNumInterp=1000;

有文本的热图,在热图色块上点击时,尽量俩点点击在同一位置且不要碰到文字,比如俩色块都点击同一边角(下图所示即为点击两个色块左下角):

提取效果:


以上已给出完整代码,想要更多例子练练手:

【热图数据提取】

更新时会跟进更新以下连接:
【链接】:
https://pan.baidu.com/s/1zoStpQ54LqmR7fSXMWWyOA?pwd=slan

【提取码】:slan

MATLAB | 如何从热图中提取数据相关推荐

  1. MATLAB之从fig文件中提取数据

    1 如果你的fig文件中的图像每个像素都有数据,可以通过以下方式获得图像每个点的值,输出data是矩阵,大小是图像像素的行列数 open('figname.fig'); h=get(gca,'Chil ...

  2. matlab从fig图文件中提取数据

    matlab从fig图文件中提取数据 lh=findall(gca,'type','line'); cell_l = cellfun('length',get(lh,'xdata')); i_lh=f ...

  3. MATLAB figure中提取数据

    MATLAB figure中提取数据 (2011-10-26 14:26:21) 转载▼ 标签: 杂谈 分类: matlab figure画出来,提取数据有很多好处,方便保存,计算,加工,还可以导入到 ...

  4. matlab程序模拟汽车理论中的数据特性图动力特性图,matlab程序模拟汽车理论中的数据特性图1.doc...

    matlab程序模拟汽车理论中的数据特性图1.doc 车辆理论作业第三组第一大题确定一辆轻型货车的动力性能1.绘制发动机的使用外特性曲线N60014000NN/1000T1931329527N/100 ...

  5. 如何从卫星图中提取水系数据

    01 概述 相信大家之前有看过很多通过电子地图提取水系的教程,该方法虽然可以提取水系,但是有一定的限制,如果在一些比较偏远的地方,电子地图上没有水系数据就无法提取,存在一定的局限性,之前已经为大家介绍 ...

  6. 如何用matlab将交通实时路况图中路从图中提取出来,保留颜色

    如何用matlab将交通实时路况图中路从图中提取出来,保留颜色 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编 ...

  7. 从.fig文件中提取数据

    matlab的绘图窗口可以保存为.fig文件,方便随后的修改和再加工.那么,当需要提取图中曲线的数据时,该怎么办?(2018b版matlab) 平移.缩放,使图中所有数据处于图窗内: 工具->刷 ...

  8. 【Python】使用日历热图进行时序数据可视化

    相信很多人都会在 Github 中看到这么一个热图,该热图记录的是 Github 平台使用的日常贡献.在每个日历年的热图中以天为单位采样的时间序列数据.GitHub 的贡献图表示用户在过去几年中所做的 ...

  9. matlab读Excel表格数据画图,matlab读Excel表格数据画图-matlab如何从excel表格中读取数据?...

    如何将excel表格中大量数据导入matlab中并作图 1.打开matlab,点击主页下面的数据导入,你可以导入excel数据,这里导入你自己命名的huitushuju文件. 2.单击"打开 ...

最新文章

  1. 李洋疯狂C语言之将”you are come from shanghai ”倒置为”shanghai from come are you”,将句子中的单词位置倒置,而不改变单词内部结构
  2. HDU 下沙的沙子有几粒
  3. 人工智能数学基础之线性代数(持续更新)
  4. 惯性导航算法matlab,基于MATLAB.Simulink的捷联惯性导航仿真
  5. 计算机中年级排名怎么操作,智学网怎么查看年级排名?智学网查看年级排名的方法...
  6. 如何一个网络连两台计算机,两台电脑用一根网线直连如何配置
  7. Kernel那些事儿之内存管理(6) --- 衣带渐宽终不悔(下)
  8. 极限编程XP 的12个最佳实践
  9. 炒股赚钱最重要的是炒股心态和纪律
  10. 计算雅思成绩C语言,雅思考试总成绩计算查分表
  11. JavaScript-事件之onmousemove
  12. linux 下使用百度云盘
  13. Arduino uno控制蜂鸣器播放音乐(以《大鱼》为例)
  14. EasyUI(修改删除)
  15. 机器人 海难饥荒_饥荒海难wx78怎么样?机器人好用吗?
  16. linux普通账户变为管理员,你就可以将普通账户升级为管理员账户了
  17. 【STM32F429的DSP教程】第21章 DSP矩阵运算-加法,减法和逆矩阵
  18. OC 教程 极光分享
  19. 用word写毕业论文时当未正常保存文件时,重新打开时,封面格式混乱的解决方法
  20. 首先定义一个Point (点)类,包含属性x,y(x,y为坐标点),方法有setPoint、getX、getY和OprintInfo...python编程题练习

热门文章

  1. 易观 OLAP 大赛揭晓 PingCAP 斩获商业组桂冠
  2. asp动态网站编程课程体系
  3. 常见电平类型:TTL电平,CMOS电平,232/485电平,OC门,OD门
  4. 【Android App】实战项目之实现你问我答的智能语音机器人(超详细 附源码和演示视频)
  5. 筛选法求质数(Java实现)
  6. 机器视觉实验四: 为人脸添加装饰物特效实验(OpenCV-python代码)
  7. IOS 将百度网盘中的文件直接发到微信而不是通过小程序或是网盘链接
  8. RabbitMQ之mandatory和immediate介绍
  9. 脑波震动(一):头部脑波震动
  10. 图的深度优先算法和广度优先算法