MATLAB | 赠书 | 如何从热图中提取数据

news2024/12/30 3:00:38

gzh上这篇文章正在抽奖赠书:截止日期2023年1月9日12:00(周一)

MATLAB | 文末赠书 | 如何从热图中提取数据

赠送3本由北京大小出版社提供的《SPSS统计分析大全》

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

工具函数

由于只是初版,要手动改的地方还是不少的,要设置好要提取数据的图片地址,结果存储地址,数据热图行数、列数以及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)>0
            pntSet(end,:)=[];
        end
        pntSet=round(pntSet);
        pntSet(pntSet<1)=1;
        if size(pntSet,1)>4
            set(gcf,'WindowButtonDownFcn',[])
            saveColor();
            close all
        else
        % 标记采样点位置和数值
        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)),']'])
        end
        end
    end
    function 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)'];
        else
            tPntSet=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)];
        end
        CMap=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);
            end
        end
        % 计算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);
            end
        end
        % 存储数值
%         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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十.指针进阶(对指针的深度理解)

目录 一. 字符指针 1.字符指针的定义 2.字符指针的用法 3.字符指针练习 二. 数组指针 1.指针数组的定义 2.指针数组的用法 三. 指针数组 1.数组指针的定义 2.数组名和&数组名的区别 3.数组指针的用法 4.练习 四. 数组传参和指针传参 1.一维数组传参 2.二维数…

十、MyBatisX插件

文章目录十、MyBatisX插件1 安装MyBatisX插件2 MybatisX代码速成3 在mapper接口中实现自定义功能【尚硅谷】MyBatisPlus教程-讲师&#xff1a;杨博超 失败&#xff0c;是正因你在距成功一步之遥的时候停住了脚步。 十、MyBatisX插件 MyBatis-Plus为我们提供了强大的mapper和ser…

Jdbc配置文件连接mysql8.0——通过拼接字符串进行批量增删改操作

目录 一、基类BaseDao 二、对dog表的批量增删改操作 (一)Dog类 (二)DogDao接口 (三)DogDaoImpl实现类 1.批量新增 2.批量删除 3.批量修改 (四)Test测试 1.新增 2.删除 3.修改 三、对master表进行批量增删改 (一)Master类 (二)MasterDao接口 (三)MasterDaoImpl实…

RK3588平台开发系列讲解(内核调试篇)oops分析

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、oops简介二、oops分析2.1、实验代码2.2、oops信息2.3、oops分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢当系统内核发生kernel panic的时候,系统会打印出oops信息,本篇主要介绍如何根据oops定位问…

2022/1/6总结

今天学习了KMP算法。 KMP算法 这是一个字符串查找的算法&#xff0c;我们之前学习的字符串查找都是暴力穷举&#xff0c;然而这个效率太低&#xff0c;于是有三位大佬发明了线性的KMP算法。 算法说难不难&#xff0c;说简单也不简单。 算法的核心思想是找到最长的相等的前…

Struts2框架之Action配置

Struts2框架之Action配置Action配置1、访问Action的三种方式1.1、method属性访问1.2、Action动态方法调用1.3、通配符调用2、配置默认的ActionAction配置 Action控制器在Struts2框架中至关重要&#xff0c;主要作用如下&#xff1a; 封装工作单元数据转移的场所返回结果字符串…

(黑马C++)L07 多态

一、多态的基本概念 多态是面向对象程序设计语言中除数据抽象和继承之外的第三个基本特征。 多态&#xff1a;父类的引用或者指针指向子类对象 C支持编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09;&#xff0c;运算符重载和函数重…

纷享销客CRM让科顺营销人更容易呼唤到“炮火”

希望让听得见“炮声”的人&#xff0c;更容易呼唤到“炮火”。对于在一线做营销的人而言&#xff0c;他们就是听到“炮声”的人。让一线的人员听得到“炮声”也就是销售线索、商机&#xff0c;能呼唤到“炮火”也就是呼唤到他们需要的资源。这恐怕是所有营销人都希望达到的境界…

ubuntu Ad-Hoc组网通信

目录 WIFI通信的多种组网方式 1、AP模式 2、Ad-hoc模式 ubuntu18配置ad-hoc模式 WIFI通信的多种组网方式 1、AP模式 最常用的模式&#xff0c;需要一个节点&#xff08;一般是路由器&#xff09;作为AP&#xff0c;其他节点连接到这个AP产生的wifi网络。通信拓扑是星形&a…

11_6、Java集合之Map接口的使用

一、引入Map与Collection并列存在。用于保存具有映射关系的数据:key-value &#xff08;双列集合框架&#xff09;&#xff0c;Map 中的 key 和 value 都可以是任何引用类型的数据 。Map 中的 key 用Set来存放&#xff0c;不允许重复&#xff0c;即同一个 Map 对象所对应 的类&…

在rhel6系统部署iscsi远程存储

文章目录一 需求二 环境准备三 服务端配置3.1 添加硬盘3.2 安装软件3.3 编写配置文件3.4 启动服务3.5 检查配置信息四 客户端配置4.1 安装软件包4.2 启动服务4.3 发现目标4.4 登陆目标4.5 实现开机自动挂载五 对部署进行测试一 需求 1&#xff09;首先在服务端添加一块10G的硬…

实验二十二 配置访问控制列表AGL

实验二十二 配置访问控制列表AGL一、 ACL基础概念 1、访问控制列表根据源地址、目标地址、源端口或目标端口等协议信息对数据包进行过滤&#xff0c; 从而达到访问控制的目的 。可以在路由器、三层交换机等设备上使用 &#xff0c;目前部分新二层交换 机也支持ACL。 2、ACL由编…

十、k8s DashBoard

文章目录1 部署Dashboard2 使用DashBoard之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实&#xff0c;为了提供更丰富的用户体验&#xff0c;kubernetes还开发了一个基于web的用户界面&#xff08;Dashboard&#xff09;。用户可以使用Dashboard部署容…

超级浏览器的技术原理,超级浏览器的浏览器指纹是什么?

浏览器指纹是超级浏览器的识别信息&#xff0c;网站可以通过这些信息来识别用户&#xff0c;判断用户的唯一性。常见的浏览器指纹有IP地址、浏览器所在地区、时区&#xff1b;用户代理&#xff08;User Agent&#xff09;相关的操作系统及版本、CPU 类型、浏览器及版本、浏览器…

吴恩达《机器学习》——PCA降维

PCA降维1. 主成分分析1.1 数据降维动机1.2 PCA降维目标问题分析2. PCA数学原理分析2.1 求协方差矩阵的碎碎念2.2 PCA实现方法3. Python实现3.1 进行人脸数据压缩数据集、源文件可以在Github项目中获得 链接: https://github.com/Raymond-Yang-2001/AndrewNg-Machine-Learing-Ho…

一些实用的办公工具分享给你

ABBYY FineReader 这是一个可以转换PDF格式的图片文字识别软件&#xff0c;下载之后可以免费试用七天&#xff0c;或者选择去它的网站上传PDF进行识别转换&#xff0c;一天最多可以转换10次&#xff0c;且一次只能转换3个页面。 【操作方法】 打开软件&#xff0c;点击“图像…

(day3)自学Java——面向对象

非原创&#xff0c;为方便自己后期复习 目录 1.类和对象 2.封装 3.就近原则和this关键字 4.构造方法 5.标准的javabean类 6.三种情况的对象内存图 7.基本数据类型和引用数据类型 8.this的内存原理 9.面向对象综合训练 (1)文字版格斗游戏 (2)两个对象数组练习 (3)对…

产品上新|语音识别+主题抽取,Magic Data多人会议数据集助您打造领先智能会议系统

2020年以来&#xff0c;新冠加快了线下向线上搬迁的速度&#xff0c;使得线上办公、在线教育、远程会议得到飞速普及和发展。艾媒咨询数据显示&#xff0c;2021年中国视频会议行业市场规模达148.2亿元。各类视频会议产品价格较低、操作便捷高效&#xff0c;普及率越来越高&…

vsftp开启登录,上传,下载,删除等操作审计日志

vsftp开启登录&#xff0c;上传&#xff0c;下载&#xff0c;删除等操作审计日志 背景 今天业务告知说有人把前天下午和昨天一天的ftp上面的附件被人删除了&#xff0c;首先我是非常的惊讶&#xff0c;居然会发生这种事&#xff0c;但是好在这个ftp不是我们负责的&#xff0c;…

驱动之设备模型

1. 起源与新方案 1.1 起源 仅devfs&#xff0c;导致开发不方便以及一些功能难以支持 热插拔不支持一些针对所有设备的同意操作&#xff08;如电源管理&#xff09;不能自动mknod用户查看不了设备信息设备信息硬编码&#xff0c;导致驱动代码通用性差&#xff0c;即没有分离设…