计算图像ab色彩空间分布时np.histogram2d的ValueError问题解决
解决np.histogram2d报错:too many values to unpack (expected 2)
执行代码np.histogram2d(pixel_ab[:, 0], pixel_ab[:, 1], bins=(ab_values[:-1], ab_values[:-1]), density=True)时抛出异常:
ValueError: too many values to unpack (expected 2)
异常根源是底层调用的histogramdd函数收到了3维输入,但预期处理的是2维数据。
问题原因
原代码中,每个图像转换为LAB色彩空间后,ab通道是(H, W, 2)的三维数组。使用np.vstack(pixel_ab)拼接时,会按第一维度堆叠,最终得到的pixel_ab形状为(N*H, W, 2)(N为图像数量)。此时pixel_ab[:, 0]和pixel_ab[:, 1]都是(N*H, W)的二维数组,而np.histogram2d要求输入的x、y必须是一维数组,二维输入会被内部解析为更高维数据,触发维度不匹配的报错。
修复方案
修改pixel_ab的拼接逻辑:将每个图像的ab通道先展平为(H*W, 2)的二维数组,再拼接所有图像的像素数据,最终得到形状为(总像素数, 2)的二维数组,确保输入histogram2d的x、y是一维数组。
修改后的完整代码
import numpy as np from skimage.color import rgb2lab from scipy.ndimage import gaussian_filter def compute_color_distribution(images, ab_bins=32, sigma=5, lam=0.5): ab_values = np.linspace(-1, 1, ab_bins) ab_space = np.stack(np.meshgrid(ab_values, ab_values), axis=-1).reshape(-1, 2) pixel_ab = [] for img in images: lab_img = rgb2lab(img / 255.0) # 将ab通道展平为(H*W, 2)的二维数组 ab_flat = lab_img[:, :, 1:].reshape(-1, 2) / 128 pixel_ab.append(ab_flat) # 拼接所有图像的展平ab数据 pixel_ab = np.concatenate(pixel_ab, axis=0) hist, x_edges, y_edges = np.histogram2d(pixel_ab[:, 0], pixel_ab[:, 1], bins=(ab_values[:-1], ab_values[:-1]), density=True) smoothed_hist = gaussian_filter(hist, sigma) p = smoothed_hist / np.sum(smoothed_hist) p_tilde = (1 - lam) * p + lam / (ab_bins * ab_bins) weights = (1 / p_tilde).flatten() weights /= np.sum(p * weights) return ab_space, weights
也可以用np.vstack替代np.concatenate,只要确保每个待拼接元素是二维数组即可,效果一致。
内容的提问来源于stack exchange,提问作者stackUnderflow
相关产品推荐
相关产品推荐

