You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.07 16:15:42