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 函数,对于联合直方图中的每个 i
和 j
,您想搜索我们遇到强度 i
在图像中以及在相同空间位置中的梯度值j
。我们计算遇到的次数,然后进入第 i
th 行和 j
th 列条目的联合直方图。
您链接到的 post 正在做完全相同的事情,但第二张图片只是一张普通的强度图片。你所要做的就是用你的渐变图像替换第二个图像,这样你就可以肯定地使用我的 post.
您唯一需要做的就是设置 im1 = Y
和 im2 = G
。如果您查看链接到的 post,我刚刚修改了正在计算联合直方图的 post,以提高效率。我不必要地声明了所有 ones
的向量。
您所指的 post 假设 Y
和 G
都是整数值。然而,如果你在 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。
祝你好运!
使用最广泛的均匀性度量之一是香农熵:
其中 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 函数,对于联合直方图中的每个 i
和 j
,您想搜索我们遇到强度 i
在图像中以及在相同空间位置中的梯度值j
。我们计算遇到的次数,然后进入第 i
th 行和 j
th 列条目的联合直方图。
您链接到的 post 正在做完全相同的事情,但第二张图片只是一张普通的强度图片。你所要做的就是用你的渐变图像替换第二个图像,这样你就可以肯定地使用我的 post.
您唯一需要做的就是设置 im1 = Y
和 im2 = G
。如果您查看链接到的 post,我刚刚修改了正在计算联合直方图的 post,以提高效率。我不必要地声明了所有 ones
的向量。
您所指的 post 假设 Y
和 G
都是整数值。然而,如果你在 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。
祝你好运!