最广泛使用的均匀性测量之一是香农熵:
其中p是L灰度级图像的归一化直方图。
我们不仅可以通过使用图像强度而且可以使用图像局部梯度来测量这种熵,因为均匀图像不仅表现出良好的有序强度,而且在均匀区域中也能很好地聚集非常低的梯度值(JV Manjon等,“A Nonparametric MRI”) “非均匀性校正方法”,医学图像分析,2007年。
设Y是具有M个像素和L1灰度级的图像,并且令G是与具有L2灰度级的局部梯度的大小相对应的关联图像。强度梯度联合直方图定义为:
其中δ是Kronecker delta函数。 那么归一化的强度 - 梯度联合直方图:
因此,与强度 - 梯度联合直方图相关联的熵 是:
我需要为生物医学图像数据计算上述熵:http://i.stack.imgur.com/I4hf4.png。我发现这个讨论很有用:Mutual information and joint entropy of two images - MATLAB,但我不知道在这次讨论中联合直方图和联合熵(由@rayryeng计算)是否与我需要的相同,如果没有,我怎么能用Matlab计算这个熵?任何帮助都一如既往地受到赞赏。
答案 0 :(得分:2)
是的,您仍然可以使用我的帖子。
查看上面的问题,使用Kronecker Delta函数,对于联合直方图中的每个i
和j
,您希望搜索遇到强度的所有值{{1 }}在图像中以及相同空间位置中的渐变值i
。我们计算这些遇到的次数,并进入联合直方图的j
th 行和i
th 列条目。
你链接到的帖子做的完全一样,但第二张图片只是一张普通的强度图片。您所要做的就是用渐变图像替换第二个图像,这样您肯定可以使用我的帖子。
您唯一需要做的就是设置j
和im1 = Y
。如果你查看你链接的帖子,我只是修改了计算联合直方图的帖子,以提高效率。当我没有必要时,我不必要地声明了所有im2 = G
的向量。
您所指的帖子假设ones
和Y
都是整数值。但是,如果G
中的渐变值不是整数(很可能就是这种情况),您仍然可以使用我的帖子,但您必须分配每个唯一的G
值为唯一ID,并将此ID数组用作double
的输入。因此,您必须使用unique
的第三个输出来帮助您实现此目的。第三个输出将为accumarray
中遇到的每个唯一浮点值提供唯一ID。从我的帖子中借用代码,这就是你要为每种情况做的事情:
G
indrow = double(Y(:)) + 1;
indcol = double(G(:)) + 1;
jointHistogram = accumarray([indrow indcol], 1);
jointProb = jointHistogram / length(indrow);
indNoZero = jointHistogram ~= 0;
jointProb1DNoZero = jointProb(indNoZero);
jointEntropy = -sum(jointProb1DNoZero.*log2(jointProb1DNoZero));
请注意上面indrow = double(Y(:)) + 1;
[~,~,indcol] = unique(G(:)); %// Change
jointHistogram = accumarray([indrow indcol], 1);
jointProb = jointHistogram / length(indrow);
indNoZero = jointHistogram ~= 0;
jointProb1DNoZero = jointProb(indNoZero);
jointEntropy = -sum(jointProb1DNoZero.*log2(jointProb1DNoZero));
会自动转换为id
并且它会自动从1开始,所以不需要像我们的图像强度那样偏移1