首页 > 解决方案 > cv2.IMREAD_GRAYSCALE 如何将 16 位图像转换为 8 位(OpenCV python)?

问题描述

我正在使用 OpenCV 在 python 中导入图像。

import cv2
img = cv2.imread(img, cv2.IMREAD_GRAYSCALE)

该图像是 16 位.png.tif,并被转换为 8 位cv2.IMREAD_GRAYSCALE(如预期的那样)。我很高兴 OpenCV 转换了我的图像。我知道cv2.IMREAD_UNCHANGED如果我想要 16 位图像,我可以使用。

我只想知道OpenCV 如何将我的图像从 16 位转换为 8 位例如通过典型的归一化,或以其他可能使像素饱和的方式?对于我的下游问题,保留一般范围更为重要。

我检查了 OpenCV 文档,找不到对此的解释。我找不到类似的问题。

编辑:我的图像是单通道的。

标签: pythonopencvimage-processing

解决方案


uint 16 图像(或 16 位图像)使用 0 到 2^16-1 的值,而 uint8 图像(或 8 位图像)仅使用 0 到 2^8-1 的范围。如果只是将原始值强制转换为 uint8,饱和会破坏大量信息。这表现为质量下降。这是由于位深度而发生的。


“位深度”决定了您可以做出的最小更改,相对于某些值范围。如果我们的比例是从纯黑色到纯白色的亮度,那么我们从 2 位数字中得到的 4 个值将包括:黑色、深中间调、浅中间调和白色。这是一个相当粗糙的比例,对于照片来说不是很有用。但是,如果我们有足够多的位,我们就有足够的灰度值来制作从黑色到白色的完美平滑渐变。

这是一个比较不同位深度下的黑白渐变的示例。此处嵌入的图像只是一个示例,单击此处可查看位深高达 14 位的 JPEG2000 格式的全分辨率图像。根据显示器的质量,您可能最多只能显示 8-10 位的差异。


查看此图片以更好地理解


所有软件设计都使用和实现相同的过程。


推荐阅读