最广泛使用的均匀性度量之一是香农熵:
其中 p 是 L 灰度级图像的归一化直方图。
我们不仅可以使用图像强度,还可以使用图像局部梯度来测量这种熵,因为同质图像不仅表现出有序的强度,而且在同质区域中很好地聚集了非常低的梯度值(J.V. 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 ,但我不知道在这个讨论中计算的联合直方图和联合熵是否与我需要的相同,如果不是,我如何使用 Matlab 计算这个熵?一如既往地感谢任何帮助。
最佳答案
是的,您仍然可以使用我的帖子。
查看上面的问题,使用 Kronecker Delta 函数,对于联合直方图中的每个 i
和 j
,您想要搜索我们所在位置的所有值在图像中遇到强度 i
以及在相同空间位置 中的梯度值 j
。我们计算这些遇到的次数,然后进入 i
th 行和 j
th 列条目的联合直方图。
您链接到的帖子做的是完全相同的事情,但第二张图片只是一张普通的强度图片。您所要做的就是用您的渐变图像替换第二张图像,这样您就可以毫无疑问地使用我的帖子。
您唯一需要做的就是设置 im1 = Y
和 im2 = G
。如果您查看链接到的帖子,我刚刚修改了计算联合直方图的帖子,以提高效率。我不必要地声明了所有 ones
的向量。
您所指的帖子假定 Y
和 G
都是整数值。但是,如果您在 G
中的梯度值不是整数(很可能是这种情况),您仍然可以使用我的帖子,但您必须分配每个将唯一的 double
值赋给唯一的 ID,并将此 ID 数组用作 accumarray
的输入。因此,您要做的是使用 unique
的第三个输出。帮助您促进这一点。第三个输出将为 G
中遇到的每个唯一浮点值提供唯一 ID。借用我帖子中的代码,这是您针对每种情况要做的:
整数值梯度
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图像强度。
祝你好运!
关于MATLAB:与强度梯度联合直方图相关的熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27734394/