MATLAB:与 intensity-gradient 联合直方图相关的熵

MATLAB: Entropy associated to the intensity-gradient joint histogram

使用最广泛的均匀性度量之一是香农熵:

其中 p 是 L 个灰度级图像的归一化直方图。

我们不仅可以使用图像强度,还可以使用图像局部梯度来测量这种熵,因为均匀图像不仅表现出有序的强度,而且在均匀区域中也很好地聚集了非常低的梯度值(J.V。Manjon等,“一种非参数 MRI 不均匀性校正方法”,医学图像分析,2007 年)。

设Y为具有M个像素和L1灰度级的图像,设G为对应于具有L2灰度级的局部梯度大小的关联图像。强度梯度联合直方图定义为:

其中 δ 是 Kronecker delta 函数。 所以归一化的 intensity-gradient 联合直方图:

因此与 intensity-gradient 联合直方图相关联的熵 是:

我需要计算生物医学图像数据的上述熵:http://i.stack.imgur.com/I4hf4.png. I found this discussion useful: Mutual information and joint entropy of two images - MATLAB,但我不知道这个讨论中的联合直方图和计算的联合熵(@rayryeng)是否相同我需要什么,如果不需要,我如何使用 Matlab 计算这个熵?一如既往地感谢您的帮助。

是的,你仍然可以使用我的post。

查看上面的问题,使用 Kronecker Delta 函数,对于联合直方图中的每个 ij,您想搜索我们遇到强度 i在图像中以及在相同空间位置中的梯度值j。我们计算遇到的次数,然后进入第 ith 行和 jth 列条目的联合直方图。

您链接到的 post 正在做完全相同的事情,但第二张图片只是一张普通的强度图片。你所要做的就是用你的渐变图像替换第二个图像,这样你就可以肯定地使用我的 post.

您唯一需要做的就是设置 im1 = Yim2 = G。如果您查看链接到的 post,我刚刚修改了正在计算联合直方图的 post,以提高效率。我不必要地声明了所有 ones 的向量。

您所指的 post 假设 YG 都是整数值。然而,如果你在 G 中的梯度值是 而不是 整数(很可能是这种情况),你仍然可以使用我的 post,但你会必须将每个唯一的 double 值分配给一个唯一的 ID,并将此 ID 数组用作 accumarray 的输入。因此,您需要做的是使用 unique 的第三个输出来帮助您实现这一点。第三个输出将为 G 中遇到的每个唯一浮点值提供唯一 ID。借用我的 post 中的代码,这是您针对每种情况要做的事情:

整数值梯度

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 会自动转换为 double 并且会自动从 1 开始,因此不需要像我们对图像强度所做的那样偏移 1。


祝你好运!