如何在Python的openCV中显示16位4096级灰度图像?

5

我有以灰度16位tiff格式编码的图像。它们使用一种16位色深的变体,其中最大强度为4,096。

我认为openCV中默认的最大强度是65,536,所以我的图像在使用以下代码时呈现为黑色。

import cv2

image = cv2.imread("test.tif", -1)

cv2.imshow('tiff', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
print(image)

我可以使用matplotlib中的vminvmax来配置颜色映射:

输入图像描述

import cv2
import matplotlib.pyplot as plt 

image = cv2.imread("test.tif", -1)
plt.imshow(image, cmap="gray", vmin=0, vmax=4096)
plt.show()

它显示图像的内容:

enter image description here

我想坚持使用OpenCV,因为matplotlib不支持显示16位RGB图像。

cv2.imshow文档并不是很有用。有没有办法在Python OpenCV中显示16位4096强度图像?

测试图像test.tif可以在这里找到。


1
也许可以将您的图像乘以16进行显示,即65536/4096。 - Mark Setchell
我猜 cv2.equalizeHist 应该可以。 - jodis
或者 cv2.normalize - jodis
@jodis 规范化是的,均衡化则不必要。均衡化是一种非线性映射,通常情况下不建议进行。 - Cris Luengo
1个回答

11

在显示图像之前,您需要使用cv2.normalize()对图像进行缩放。

您可以设置图像的最小值和最大值,它将相应地缩放图像(通过将图像的最小值移动到alpha和图像的最大值移动到beta)。假设您的img已经是uint16类型:

img_scaled = cv2.normalize(img, dst=None, alpha=0, beta=65535, norm_type=cv2.NORM_MINMAX)

然后您可以像平常一样查看。

默认情况下,cv2.normalize() 将生成与您的输入图像相同类型的图像,因此如果您想要一个无符号16位结果,则应该将输入设置为 uint16


再次注意,这会线性拉伸您的图像范围---如果您的图像实际上从未达到0,而是最低值为100,则在归一化后,最低值将变成您设置的任何 alpha。如果不想这样做,如其中一条评论所建议的那样,您可以将图像乘以16,因为它当前仅增加到4095。使用 * 16,它将增加到65535。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接