MATLAB中imhist函数原理解析及Python等效实现问询
MATLAB
imhist 工作原理与Python等效实现 MATLAB imhist 对[0,1]范围double类型输入的处理逻辑
当输入是取值在**[0,1]区间的double类型图像**时,imhist默认生成256个统计区间,具体规则如下:
- binLocations(区间中心):生成256个等距的中心值,范围从
1/(2*256)到1 - 1/(2*256),相邻中心的间隔为1/256。用MATLAB代码表示为:binLocations = linspace(1/(2*256), 1 - 1/(2*256), 256); - counts(区间像素计数):统计每个区间内的像素数量,每个区间的范围是
[binLocations(i) - 1/(2*256), binLocations(i) + 1/(2*256)),最后一个区间特殊处理为闭区间(包含1这个值)。
与NumPy histogram 的差异
NumPy的np.histogram返回的binLocations是区间边缘,因此256个区间对应257个边缘值;而MATLAB返回的是区间中心,仅256个值。两者的区间划分逻辑一致,只是对bin的表示方式不同,统计得到的counts数值本质是匹配的。
Python中实现与imhist完全一致的功能
方法1:基于np.histogram转换
利用NumPy的直方图结果,将区间边缘转换为区间中心,即可得到和MATLAB一致的输出:
import numpy as np # 假设intensity是输入的222x222 double数组,取值范围[0,1] counts, bin_edges = np.histogram(intensity, bins=256, range=[0, 1]) # 将区间边缘转换为区间中心,对应MATLAB的binLocations bin_locations = (bin_edges[:-1] + bin_edges[1:]) / 2
此时得到的counts和bin_locations与MATLAB输出完全一致。
方法2:直接实现MATLAB的统计逻辑
手动生成区间中心并统计像素,逻辑更贴合MATLAB的imhist:
import numpy as np # 展平输入数组,方便统计 intensity_flat = intensity.flatten() num_bins = 256 bin_width = 1 / num_bins # 生成MATLAB风格的区间中心 bin_locations = np.linspace(bin_width/2, 1 - bin_width/2, num_bins) # 计算每个像素所属的bin索引 bin_indices = np.floor(intensity_flat / bin_width).astype(int) # 将等于1的像素归到最后一个bin(避免索引越界) bin_indices[intensity_flat == 1] = num_bins - 1 # 统计每个bin的像素数量 counts = np.bincount(bin_indices, minlength=num_bins)
内容的提问来源于stack exchange,提问作者KEZIA ANGELINE
相关产品推荐
相关产品推荐

