python - 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 文档,找不到对此的解释。我找不到类似的问题。
编辑:我的图像是单通道的。
解决方案
uint 16 图像(或 16 位图像)使用 0 到 2^16-1 的值,而 uint8 图像(或 8 位图像)仅使用 0 到 2^8-1 的范围。如果只是将原始值强制转换为 uint8,饱和会破坏大量信息。这表现为质量下降。这是由于位深度而发生的。
“位深度”决定了您可以做出的最小更改,相对于某些值范围。如果我们的比例是从纯黑色到纯白色的亮度,那么我们从 2 位数字中得到的 4 个值将包括:黑色、深中间调、浅中间调和白色。这是一个相当粗糙的比例,对于照片来说不是很有用。但是,如果我们有足够多的位,我们就有足够的灰度值来制作从黑色到白色的完美平滑渐变。
这是一个比较不同位深度下的黑白渐变的示例。此处嵌入的图像只是一个示例,单击此处可查看位深高达 14 位的 JPEG2000 格式的全分辨率图像。根据显示器的质量,您可能最多只能显示 8-10 位的差异。
所有软件设计都使用和实现相同的过程。