python - opencv中cvtColor()之前Numpy 8位图像转换为16/32位图像

标签 python opencv numpy colors

我根据阅读文档的理解进行了一些测试,但偶然发现了这一点。

来源:NumPy convert 8-bit to 16/32-bit image

 i = cv2.imread(imgNameIn, cv2.CV_LOAD_IMAGE_COLOR) # Need to be sure to have a 8-bit input
 img = np.array(i, dtype=np.uint16) # This line only change the type, not values
 img *= 256 # Now we get the good values in 16 bit format

但是从我在这里读到的 http://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html

要从 32 位缩小到 8 位,必须除以 255,而不是上面提到的我从另一篇文章中得到的 256?下面的代码是我正在尝试使用的代码。

如果有人能够检查我是否正确完成了缩放,我将不胜感激。 我问这个问题主要是为了确认一下假定的类型转换值是255还是256?

最佳答案

我不同意您链接的问题的答案。格式uint8可以表示256个整数值,即从0到255的整数(2^8 - 1)。 256 不能表示为 uint8uint16 的范围从 0 到 (2^16 - 1) = 65535

因此,如果您想要 16 位、具有 65535 个颜色级别的图像,并且当您读取图像和格式时,图像的强度值在 [0, 1] 范围内float,您需要将这些值乘以 65535,然后将数组转换为 uint16

最好将最终结果的类型转换为所执行操作的最后一步。这主要有两个原因: - 如果您执行 float 除法或乘法,结果将返回 float ,您将需要再次更改类型。 - 一般来说(在该术语的数学意义上),一个变换 从浮点到整数会引入错误。类型转换类型 操作的最后阶段可防止错误传播。

要返回到 8 位,即 256 个颜色级别,您需要将所有值乘以 255/65535

同样的推理也适用于具有 2^32 = 4,294,967,296 可能强度值(即 [0, 4294967295] 范围内的值)的 32 位图像。这些数字变得很大,您宁愿使用浮点格式的 32 位图像,其中值包含在 [0, 1] 范围内。

PS:我发现你的代码很困惑,没有详细说明。了解 8/16/32/64 位格式表示图像中可能的强度级别数量是让您了解对图像进行的转换的关键。

关于python - opencv中cvtColor()之前Numpy 8位图像转换为16/32位图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45885576/

相关文章:

python - 简单数据操作 : R vs python

python - Theano 中比 T.eye 更好的方法

python - 通过 bool 复选标记激活表单中的字段 - Odoo v8

android - 使用 OpenCV 3.1 在 Android Studio 1.5 中开发原生 C++ 应用程序

c++ - OpenCV 断言在 r​​oi 内失败?

c++ - 围绕 avcodec_open/close 的线程锁定

python - Tensorflow 2.0 : how to transform from MapDataset (after reading from TFRecord) to some structure that can be input to model. 适合

Python interp1d 与 UnivariateSpline

python - 用python替换二维数组的对角线

python - 如何对 pandas、torch 和 numpy 输入使用打字覆盖