OpenCV中cv2.imwrite保存图像为纯黑文件的问题排查与解决
问题根因
cv2.imshow和cv2.imwrite对浮点型图像的处理逻辑不一致:
cv2.imshow接收到值范围为[0.0, 1.0]的浮点型(float32/float64)图像时,会自动将所有像素值乘以255,映射到8位图像的[0,255]亮度区间后渲染,因此显示效果正常。cv2.imwrite保存PNG、JPG等常规格式时,不会自动做范围映射。如果传入的是[0,1]区间的浮点数组,函数会直接将数值截断转换为8位无符号整数:所有小于1的像素值会被转为0(纯黑),仅值恰好为1的像素会被存为亮度1的极暗点,最终输出文件看起来就是全黑的。
可通过以下代码验证数组属性,确认问题:
print(saliency_map.dtype) # 会输出float32/float64 print(saliency_map.min(), saliency_map.max()) # 输出值范围在0~1之间
修复方法
保存前将浮点型的显著性图缩放至[0,255]区间,转换为uint8类型即可:
sm = pySaliencyMap.pySaliencyMap(frame_width, frame_height) saliency_map = sm.SMGetSM(frame) cv2.imshow('Saliency Map', saliency_map) filename_saliency = 'saliency_map' + str(saliency_num) + '.png' # 缩放值范围并转换为8位无符号类型 saliency_map_save = (saliency_map * 255).astype('uint8') cv2.imwrite(filename_saliency, saliency_map_save) saliency_num += 1
如果显著性图输出值存在偏移、没有严格落在[0,1]区间,可以用OpenCV自带的归一化函数处理,避免保存后对比度异常:
saliency_map_save = cv2.normalize( saliency_map, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U )
内容的提问来源于stack exchange,提问作者Pressing_Keys_24_7
相关产品推荐
相关产品推荐

