如何获取灰度图像概率分布并使用ks_2samp计算KL散度?
解决方法
一、获取灰度图的概率分布
你调用plt.hist()时,它会返回三个结果:直方图的计数数组、区间边界、图形元素。直接接收两个图像的计数结果,再除以总像素数就能得到概率分布:
import numpy as np import matplotlib.pyplot as plt # 你已有的展平数组 imageone = imgGray.flatten() imagetwo = imgGray2.flatten() # 获取直方图计数和区间(如果两个图像灰度范围不同,建议手动指定bins确保对齐,比如bins=np.linspace(0, 1, 257)) counts1, bins1, _ = plt.hist(imageone, bins=256) counts2, bins2, _ = plt.hist(imagetwo, bins=256) # 计算概率分布(总像素数就是展平数组的长度) prob1 = counts1 / len(imageone) prob2 = counts2 / len(imagetwo)
二、计算KL散度
可以用scipy.stats.entropy计算KL散度,注意要处理概率为0的情况(避免log(0)报错),加一个极小值即可:
from scipy.stats import entropy # 加极小值避免0值问题 epsilon = 1e-10 prob1_safe = prob1 + epsilon prob2_safe = prob2 + epsilon # 计算KL散度(D(P||Q),即基于prob1的分布相对于prob2的散度) kl_div = entropy(prob1_safe, prob2_safe) print(f"KL散度: {kl_div}")
三、关于ks_2samp函数的说明
ks_2samp是Kolmogorov-Smirnov检验,用来判断两个样本是否来自同一分布,它不需要先计算概率分布,直接传入展平后的像素数组就行:
from scipy.stats import ks_2samp stat, p_value = ks_2samp(imageone, imagetwo) print(f"KS统计量: {stat}, p值: {p_value}")
注意:这个指标和KL散度不同——KL散度衡量两个分布的差异程度,KS检验是通过假设检验判断分布是否相同,按需选择即可。
内容的提问来源于stack exchange,提问作者Jean-Paul Azzopardi
相关产品推荐
相关产品推荐

