转换为 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.uint16
或 np.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)
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.uint16
或 np.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)