在1D数组上使用scikit-image metrics报错的解决方法咨询
修复skimage指标在一维信号上的错误
1. 解决variation_of_information和adapted_rand_error的TypeError
这两个指标是为图像分割任务设计的,要求输入是整数类型的分割标签(比如标记每个像素所属区域的整数ID),而非连续数值的信号。你的clean_signal和noisy_signal都是float64类型的连续值,自然会触发类型错误。
修复建议:
- 若要衡量连续信号的差异,换用适配的指标:比如
mean_squared_error、修复后的peak_signal_noise_ratio、structural_similarity(需调整参数适配一维数据)。 - 若非要尝试用这两个指标(不推荐,不符合使用场景),可将信号转为整数(比如放大后取整),但结果无实际意义:
# 仅作演示,不建议用于实际任务 clean_int = (clean_signal * 10).astype(int) noisy_int = (noisy_signal * 10).astype(int) M.variation_of_information(noisy_int, clean_int) M.adapted_rand_error(noisy_int, clean_int)
2. 解决peak_signal_noise_ratio的ValueError
PSNR默认假设输入是标准图像格式的数值范围(比如uint8的0-255、float的0-1),但你的clean_signal取值范围是1到9.9,超出了默认预期,因此需要手动指定data_range参数,值为真实信号的最大值减去最小值。
修复代码:
# 计算真实信号的数值范围 data_range = clean_signal.max() - clean_signal.min() # 手动传入data_range参数 M.peak_signal_noise_ratio(noisy_signal, clean_signal, data_range=data_range)
完整可运行代码
import numpy as np import skimage.metrics as M clean_signal = np.arange(1,10, .1) noisy_signal = clean_signal + np.random.normal(0,1,90) # 正常运行的MSE指标 mse = M.mean_squared_error(noisy_signal, clean_signal) print(f"MSE: {mse}") # 修复后的PSNR指标 data_range = clean_signal.max() - clean_signal.min() psnr = M.peak_signal_noise_ratio(noisy_signal, clean_signal, data_range=data_range) print(f"PSNR: {psnr}") # 分割指标的演示用法(不推荐) clean_int = (clean_signal * 10).astype(int) noisy_int = (noisy_signal * 10).astype(int) vi = M.variation_of_information(noisy_int, clean_int) print(f"Variation of Information: {vi}")
内容的提问来源于stack exchange,提问作者Bharat Sharma
相关产品推荐
相关产品推荐

