转换为 8 位图像会导致黑色出现白点。为什么是这样?

Converting to 8-bit image causes white spots where black was. Why is this?

Img 是 dtype=float64 numpy 数据类型。当我 运行 此代码时:

Img2 = np.array(Img, np.uint8)

我的图片背景变白了。我怎样才能避免这种情况并仍然获得 8 位图像?

编辑:

当然,我可以提供更多信息。单张图片由 400 张图片组成。它们均来自 .avi 视频文件,并且每个图像都被转换为 NumPy 数组,如下所示:

gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

对整个堆栈执行更复杂的操作,但不涉及创建新图像。它只是对每个一维数组执行计算以产生单个像素。

插值很可能是线性的(使用 matplotlib 绘制图像时的默认设置。图像保存为 .PNG。

您可能会看到溢出。如果将 257 转换为 np.uint8,您将得到 1。根据 google 搜索,avi 文件包含颜色深度为 15 - 24 位的图像。当您将此深度投射到 np.uint8 时,您会看到白色区域变暗并且(如果在某处进行归一化)黑暗区域也变白(-5 -> 251)。对于变亮的区域,您可以检查原始图像中是否有负像素值Img

Docs 说有时您必须进行一些缩放以获得正确的投射,并且尽可能使用更高的深度以避免伪影。

解决方案似乎要么在更高的深度下工作,即投射到 np.uint16np.uint32,要么在减少深度之前缩放像素值,即已经 Img2作为一个 numpy 矩阵

# make sure that values are between 0 and 255, i.e. within 8bit range
Img2 *= 255/Img2.max() 
# cast to 8bit
Img2 = np.array(Img, np.uint8)