matlab计算联合熵,两个图像的相互信息和联合熵 – MATLAB
要计算联合熵,您需要计算两个图像之间的联合直方图.联合直方图基本上与正常1D直方图相同,但第一维度记录第一图像的强度,第二维度记录第二图像的强度.这通常被称为
co-occurrence matrix.在联合直方图中的位置(i,j),它告诉我们在第一个图像中具有强度i和第二个图像中的强度j遇到的强度值有多少图片.
重要的是,这会记录我们在同一相应位置看到这对强度的次数.例如,如果我们具有(7,3)= 2的联合直方图计数,这意味着当我们扫描两个图像时,当我们遇到7的强度时,在第二个图像的相同对应位置,我们遇到强度为3次,共2次.
构造一个联合直方图非常简单.
>首先,创建一个256 x 256的矩阵(假设你的图像是无符号的8位整数),并将它们初始化为全零.此外,您需要确保两个图像的大小(宽度和高度)相同.
>一旦你这样做,看看每个图像的第一个像素,我们将表示为左上角.具体来说,看看这个位置的第一张和第二张图像的强度.第一图像的强度将用作行,而第二图像的强度将用作列.
>在矩阵中查找此位置,并将矩阵中的该点增加1.
>对图像中的其余位置重复此操作.
>完成后,将所有条目除以任一图像中的元素总数(记住它们应该是相同的大小).这将给我们两个图像之间的联合概率分布.
一个人倾向于用循环来做到这一点,但是众所周知,循环是非常慢的,如果可能的话应该避免.但是,您可以通过以下方式轻松地在MATLAB中执行此操作:无循环.我们假设im1和im2是您要比较的第一和第二个图像.我们可以做的是将im1和im2转换成向量.我们可以使用accumarray来帮助我们计算关节直方图. accumarray是MATLAB中最强大的函数之一.你可以把它看成是一个缩影MapReduce范例.简单地说,每个数据输入都有一个键和一个相关的值. accumarray的目标是将属于同一个键的所有值复制一下,并对所有这些值进行一些操作.在我们的情况下,“键”将是强度值,值本身是每个强度值的值1.然后,我们需要将映射到所有bin的所有值加起来,这正是我们如何计算直方图. accumarray的默认行为是添加所有这些值.具体来说,accumarray的输出将是一个数组,其中每个位置都计算映射到该键的所有值的总和.例如,第一个位置将映射到键1的所有值的总和,第二个位置将映射到键2的所有值的总和等等.
然而,对于联合直方图,您想要确定哪些值映射到(i,j)的相同强度对,因此这里的键将是一对2D坐标.这样,在第一图像中具有i强度的任何强度和在两个图像之间共享的相同空间位置中的第二图像中的j成为相同的键.因此,在2D情况下,累加的输出将是2D矩阵,其中每个元素(i,j)包含映射到密钥(i,j)的所有值的总和,类似于先前提到的1D正是我们以后.
换一种说法:
indrow = double(im1(:)) + 1;
indcol = double(im2(:)) + 1; %// Should be the same size as indrow
jointHistogram = accumarray([indrow indcol], 1);
jointProb = jointHistogram / numel(indrow);
使用accumarray,第一个输入是键,第二个输入是这些值.一个带有accumarray的注释是,如果每个键都具有相同的值,那么可以简单地为第二个输入分配一个常量,这就是我所做的,它是1.一般来说,这是一个数组,行数相同第一个输入.另外,请特别注意前两行.您的图像将不可避免地有0的强度,但是由于MATLAB开始索引为1,所以我们需要将这两个数组相加1.
现在我们有联合直方图,计算联合熵真的很简单.它与1D中的熵相似,除了现在我们只是对整个联合概率矩阵求和.请记住,你的联合直方图将很有可能有0个条目.我们需要确保我们跳过这些,否则log2操作将不会被定义.我们现在要摆脱任何零条目:
indNoZero = jointHistogram ~= 0;
jointProb1DNoZero = jointProb(indNoZero);
注意到我搜索联合直方图而不是联合概率矩阵.这是因为联合直方图由整数组成,而联合概率矩阵将在0和1之间.由于划分,我想避免将该矩阵中的任何条目与0进行比较,因为数值舍入和不稳定性.以上也将我们的联合概率矩阵转换为堆叠1D矢量,这是很好的.
因此,联合熵可以计算为:
jointEntropy = -sum(jointProb1DNoZero.*log2(jointProb1DNoZero));
如果我对MATLAB中的图像计算熵的理解是正确的,则应该计算256个分区的直方图/概率分布,所以您可以在这里使用刚刚计算的联合熵的函数.
如果我们有浮点数据呢?
到目前为止,我们假设您处理的图像具有整数值的强度.如果我们有浮点数据怎么办? accumarray假定您正在尝试使用整数索引到输出数组,但是我们仍然可以在道路上完成我们想要的这个小凹凸.您将做的只是在两个图像中分配每个浮点值以具有唯一的ID.因此,您将使用accumarray与这些ID.为便于此ID分配,请使用unique – 特别是该功能的第三个输出.您将拍摄每个图像,将它们变成唯一的,并将这些索引输入到accumarray中.换句话说,这样做:
[~,~,indrow] = unique(im1(:)); %// Change here
[~,~,indcol] = unique(im2(:)); %// Change here
%// Same code
jointHistogram = accumarray([indrow indcol], 1);
jointProb = jointHistogram / numel(indrow);
indNoZero = jointHistogram ~= 0;
jointProb1DNoZero = jointProb(indNoZero);
jointEntropy = -sum(jointProb1DNoZero.*log2(jointProb1DNoZero));
注意,使用indrow和indcol,我们直接将这些变量的唯一的第三个输出分配,然后使用我们之前计算的相同的联合熵代码.我们也不必像以前一样将变量按照1进行偏移,因为唯一的将从1开始分配ID.
在旁边
您可以使用联合概率矩阵实际计算每个图像的直方图或概率分布.如果要计算第一张图像的直方图/概率分布,您只需为每一行累积所有列.要做第二个图像,你只需要为每一列累积所有的行.因此,您可以:
histogramImage1 = sum(jointHistogram, 1);
histogramImage2 = sum(jointHistogram, 2);
之后,你可以自己计算这两个的熵.要进行双重检查,请确保将它们都转换成PDF,然后使用标准方程式计算熵(如上所述).
如何最终计算相互信息?
要最终计算相互信息,您将需要两个图像的熵.您可以使用MATLAB的内置entropy功能,但这假设有256个独特的级别.您可能想要应用这种情况,因为存在N个不同的级别而不是256个,所以您可以使用我们上面所做的联合直方图,然后在上面的旁边的代码中计算每个图像的直方图,然后计算熵为每个图像.您只需重复共同使用的熵计算,但将其单独应用于每个图像:
%// Find non-zero elements for first image's histogram
indNoZero = histogramImage1 ~= 0;
%// Extract them out and get the probabilities
prob1NoZero = histogramImage1(indNoZero) / numel(histogramImage1);
%// Compute the entropy
entropy1 = -sum(prob1NoZero.*log2(prob1NoZero));
%// Repeat for the second image
indNoZero = histogramImage2 ~= 0;
prob2NoZero = histogramImage2(indNoZero) / numel(histogramImage2);
entropy2 = -sum(prob2NoZero.*log2(prob2NoZero));
%// Now compute mutual information
mutualInformation = entropy1 + entropy2 - jointEntropy;
希望这可以帮助!
matlab计算联合熵,两个图像的相互信息和联合熵 – MATLAB相关推荐
- matlab计算macd_[转载]4.K线图以及常用技术指标的Matlab实现-基于Matlab的量化投资...
本次主要讲解用Matlab来实现K线图以及常用的技术指标. 相关前导帖子浏览: 系列帖子目录 Matlab的Bar图中Bar颜色灵活设置的一点总结[by faruto] [原创]坐标轴刻度标签旋转升级 ...
- matlab计算传热学程序,《哈尔滨工程大学传热学大作业数值计算matlab程序内容》.pdf...
传热学作业数值计算 1 数值计算matlab 程序内容: >> tw1=10; % 赋初值 tw2=20; c=1.5; p2=20; p1=c*p2; L2=40; L1=c*L2; d ...
- matlabapp窗口图像_如何在一个matlab窗口上合并两个图像?
i have two images of size lets say image1=250x250 and image2=250x550. i want to have an image that s ...
- matlab 求其骨架,数字图像处理图像的骨架生成和提取(Matlab)三种方法
[实例简介] 数字图像处理图像的骨架生成和提取(Matlab),有三种方法,推荐给大家! [实例截图] [核心代码] Programe ├── Programe1 │ ├── 00.JPG │ ...
- matlab计算abc三相短路电流_手把手教你做FOC电机控制MATLAB仿真
一.整体结构及功能介绍用MATLAB2013以上版本打开文件,看到如图所示界面:可以看到仿真最外层由四个模块组成,电源模块(红色方框),电机与控制模块(蓝色方框),控制信号给定模块(黄色方框),信号分 ...
- 如何熟练掌握MATLAB机器学习、深度学习在图像中的处理
近年来,随着无人驾驶汽车.医学影像智慧辅助诊疗.ImageNet竞赛等热点事件的发生,人工智能迎来了新一轮的发展浪潮.尤其是在计算机视觉和图像处理领域,各种颠覆性的成果应运而生. 阅读全文点击:< ...
- 将Matlab计算结果输出至Excel中
Matlab计算结果导入Excel 1. 初级篇 在利用Matlab绘图时,其绘图比较繁琐,且图像调整较为复杂.未解决这一问题,我们可将Matlab计算的结果导出,然后利用Origin等专业绘图软件进 ...
- fvdm 跟驰模型 matlab仿真_【新书推荐】【2009.01】控制系统MATLAB计算及仿真(第3版)(黄忠霖)...
本书包括MATLAB语言基础.控制系统MATLAB仿真基础.控制系统MATLAB计算与仿真3篇. 本书上篇介绍了MATLAB 7.1 系统的相关知识,包括MATLAB 7.1系统概述与活的笔记本Not ...
- matlab中的方波信号图片_电气信息类专业课程之matlab系统仿真 第十章 DBPSK调制解调器(9)...
继续展示程序!好东西总是慢慢的吃才有味道!当然对于本科阶段的学习而言,本章知识的难度已经不算小了. 函数化编程的概念应该刻在脑子里! 误码性能的展示!!! 工程经验:看误码率就能大概知晓程序是否有问题 ...
最新文章
- left join(左联接) left join(左联接) left join(左联接)
- rabbitmq怎么停止_如何停止从选择性队列中消费消息 – RabbitMQ
- rda冗余分析步骤_群落分析的典范对应分析(CCA)概述
- Jquery的jqzoom插件的使用(图片放大镜)
- R语言︱基本函数、统计量、常用操作函数
- Android实训——图书管理系统
- Code For Better 谷歌开发者之声——Google Play
- 四年级语文期中测试卷
- 心知天气数据API 产品的高并发实践
- 【目标检测】Receptive Field Block Net for Accurate and Fast Object Detection论文理解
- SpringCloud的认识和基本入门使用
- 如何在体育场创造极致观看体验
- 通达oa 修改服务器端口,通达oa云服务器设置
- 一度智信:拼多多商家修改sku有什么影响?
- YII2 数据库常用操作案例
- (*visit)(TElemType e )函数指针理解
- 汉语言文学考研学校c等20个,汉语言文学考研江苏省内哪个学校好考
- 男女同居时的惊魂故事zz
- Java SE EE ME等有什么区别?
- vue实战项目:电商管理系统实现步骤笔记(一)
热门文章
- Google软件测试之道
- linux驱动K10运算卡,NVIDIATESLA丽台K20K10C2075C2070运算加速卡
- elementUI checkbox选中与取消选中
- html+css实现多层表格嵌套
- 我的数字IC学习路线
- 麒麟服务器下更新raid驱动
- 微信小程序解包wxappUnpacker-master 样式解不出来 SyntaxError: Unexpected end of input 的解决方式
- linux怎样将文件夹设置共享,Linux操作系统下共享文件夹设置方法介绍
- S32K系列S32K144学习笔记——ADC
- 如何精心打造一句15字的战略宣言?