为何局部二值模式(LBP)会受图像归一化影响?
关于scikit-image中LBP受图像归一化影响的原因分析
我发现scikit-image库中的局部二值模式(LBP)会受图像归一化操作的影响,这与我的预期不符。由于LBP仅涉及邻域像素间的大小比较,我原本认为线性变换不会改变结果。
测试代码
import numpy as np import skimage from skimage.feature import local_binary_pattern im = skimage.data.cell() out_im = local_binary_pattern(im, 16, 2, method='uniform') out_im = out_im[20:-20, 20:-20] # remove edges counts,bins = np.histogram(out_im) print('counts=',counts) print('bins=',bins)
原始图像运行结果
counts= [ 896 2743 9555 14928 108466 94041 28682 14703 8728 33458] bins= [ 0. 1.7 3.4 5.1 6.8 8.5 10.2 11.9 13.6 15.3 17. ]
归一化操作代码
im = (im-im.min())/(im.max()-im.min())
归一化后运行结果
counts= [ 937 2716 9504 16263 109302 92114 27753 14248 8667 34696] bins= [ 0. 1.7 3.4 5.1 6.8 8.5 10.2 11.9 13.6 15.3 17. ]
原图像的像素值范围为0-255,出现这种差异的核心原因如下:
浮点数精度误差导致大小关系反转
- 原始图像是8位无符号整数(0-255),像素间的大小比较是精确的整数运算,不存在任何歧义。
- 归一化操作将图像转换为浮点数类型,像素值通过
(im-im.min())/(im.max()-im.min())计算得到小数。当邻域像素的原始整数差值极小时(比如差值为1),归一化后的浮点数可能因精度限制产生微小舍入误差,导致原本明确的大小关系发生反转(比如原本A>B,归一化后因浮点精度变成A≈B甚至A<B)。 - 这种微小的关系反转会直接改变局部二值模式的编码值,进而影响最终的直方图统计结果。
举个直观例子:假设原图像中中心像素是127,邻域像素是128,整数比较明确128>127;归一化后(假设图像最值为0和255),中心像素值为127/255≈0.4980,邻域像素为128/255≈0.5019,此时比较仍正常。但如果原像素差值更小或分母更大时,归一化后的差值可能小到被浮点数精度截断,甚至出现计算误差导致顺序颠倒,从而改变LBP编码。
此外,scikit-image的local_binary_pattern函数对浮点数输入的比较逻辑与整数输入存在细微差异,进一步放大了精度问题带来的影响。
内容的提问来源于stack exchange,提问作者user3433489
相关产品推荐
相关产品推荐

