k-means图像量化提取光源周边特定簇出现索引错误如何解决
错误原因
调用cv2.kmeans时输入的是将原图拉伸为(总像素数, 3)的一维像素矩阵,因此输出的label数组形状为(总像素数, 1),每个元素对应单个像素的聚类结果。而你用来做索引的masked_image是保持原图(高度, 宽度, 3)的三维结构,二者维度完全不匹配,因此布尔索引时抛出维度不符的错误。
解决方法
有两种常用的修复方案,可任选其一:
方案1:将label调整为和原图匹配的二维掩码
masked_image = np.copy(final_img) cluster = 1 # 获取原图的高宽参数 h, w = image.shape[:2] # 将label reshape为和图像高宽一致的二维掩码 mask = label.reshape(h, w) == cluster # 直接对目标区域赋值 masked_image[mask] = [0, 0, 0] # 可选:cv2默认读取BGR格式,转为RGB适配matplotlib显示 masked_image_rgb = cv2.cvtColor(masked_image, cv2.COLOR_BGR2RGB) plt.imshow(masked_image_rgb) plt.show()
方案2:拉伸masked_image匹配label的一维结构
masked_image = np.copy(final_img) cluster = 1 # 先将图像拉伸为和label维度匹配的一维像素结构 masked_flat = masked_image.reshape(-1, 3) masked_flat[label.flatten() == cluster] = [0, 0, 0] # 恢复为原图形状 masked_image = masked_flat.reshape(final_img.shape) # 可选:转RGB适配显示 plt.imshow(cv2.cvtColor(masked_image, cv2.COLOR_BGR2RGB)) plt.show()
可选优化
由于你使用了cv2.KMEANS_RANDOM_CENTERS参数,每次运行的聚类中心是随机生成的,cluster编号对应的类别不固定。如果需要稳定提取光源区域,可以遍历center数组的像素值,找到亮度最高的簇作为目标区域对应的簇,避免每次运行编号变化的问题。
内容的提问来源于stack exchange,提问作者user1801745
相关产品推荐
相关产品推荐

