OpenCV - 读取 16 位灰度图像

问题描述 投票:0回答:5

我正在尝试在 Python 中使用 OpenCV 2.4 读取 16 位灰度图像,但它似乎将其加载为 8 位。

我正在做:

im = cv2.imread(path,0)
print im

[[25 25 28 ...,  0  0  0]
[ 0  0  0 ...,  0  0  0]
[ 0  0  0 ...,  0  0  0]
..., 

如何将其设为 16 位?

python opencv
5个回答
50
投票

想通了。如果其他人遇到这个问题:

im = cv2.imread(path,-1)

将标志设置为 0,以灰度形式加载,似乎默认为 8 位。将标志设置为 -1 按原样加载图像。


39
投票

为了提高可读性,请使用标志 cv2.IMREAD_ANYDEPTH

image = cv2.imread( path, cv2.IMREAD_ANYDEPTH )

8
投票

我遇到了同样的问题(使用 cv2.imread 将 16 位 .tif 加载为 8 位)。然而,使用 -1 标志并没有帮助。相反,我能够使用 tifffile 包加载 16 位图像。


3
投票

这个问题表明

image = cv2.imread('16bit.png', cv2.IMREAD_UNCHANGED)
也能解决你的问题。


0
投票

只是补充其他答案。

-1
标志对应于
cv2.IMREAD_UNCHANGED
标志。您可以在imread 模式文档中检查所有可用的标志及其在imread 代码定义中的相应值。 正如其他用户指出的那样,使用标志而不是直接使用值是一个很好的做法,因为标志值很容易发生变化。

OpenCV 4.9.0 版本的示例。

IMREAD_UNCHANGED = -1, // If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). Ignore EXIF orientation. IMREAD_ANYDEPTH = 2, // If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
因此,要读取 16 位灰度图像,以下标志就足够了:

image = cv2.imread(path, cv2.IMREAD_ANYDEPTH)
但是,

cv2.IMREAD_ANYDEPTH

 不会按预期保留颜色通道,如果您不确定图像是否具有颜色通道或者实际上是 16 位以在阅读后进一步检查,最好使用 
cv2.IMREAD_UNCHANGED
 进行阅读,因为它会尝试保留原始图像内容:

image = cv2.imread(path, cv2.IMREAD_UNCHANGED)
    
© www.soinside.com 2019 - 2024. All rights reserved.