You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取灰度图像概率分布并使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:15:34