如何使用cv2.imshow()可视化一个16位灰度图像?

4
我有一组16位分辨率的灰度无人机图像,其中可以看到一个人在移动,格式为。如何在OpenCV中将这些图像可视化为普通图像,以便我可以在OpenCV中查看图像中的信息?目前,当我尝试读取和显示图像时,只能看到黑色图像。
import argparse
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help = "Path to the image")
args = vars(ap.parse_args())

image = cv2.imread(args["image"],IMREAD_ANYCOLOR | IMREAD_ANYDEPTH)

cv2.imshow("image", image)
cv2.waitKey(0)

我已经尝试了上述的代码,但是它仍然显示完全黑色的图像。然而,当我将图像转换为png,然后使用上述的代码,那么它运行正常,但我不想这样做,因为会有信息损失。
这里是示例图像的链接。所有图像都包含不同的信息。

https://filebin.net/n3oidsqn70eq8a9x/gelmer_gas_0_Raw_316_4245_2942_1455208775.tif?t=c2m8vnsn

图片应该像下面这样。这只是为了视觉效果而在另一款软件中打开。

enter image description here


上面的代码没有显示任何图像。如何显示图像?请简单地展示你的所有代码。您是否尝试使用调试器检查变量“image”?图像的数据格式是什么? - MSpiller
如果您现在能够发布您遇到问题的其中一张图片,我们可以帮助您。 - MSpiller
1
你的问题是图像是16位的,而imshow只显示1、3、4通道的8位。为了显示目的,你可以尝试以下两种方法之一:1)使用cv2.normalize,并设置NORM_MINMAX和输出类型为cv2.CV_8U。或者你可以将图像除以256并转换为np.uint8。 - api55
@api55 在处理16位图像时,imshow 会自动将图像除以256,这应该不是问题。但仍然想知道图像应该长什么样。 - MSpiller
1
啊哈,这就解释了一切 :) 图像中的值从5903到7883,这将产生一个几乎黑色的图像。为了显示热成像图像,我建议使用normalize,然后您可以使用applycolormap和jet来获得冷->蓝,热->红... 您可能需要手动规范化它以获得固定的温度范围。 - api55
显示剩余12条评论
1个回答

2
正如您之前所说,加载很容易:
img = cv2.imread("a.tif", cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH)

然后,有不同的选项来可视化热像。简单的天真方法是从最小值到最大值进行归一化:
normed = cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)

enter image description here

之后,您可以使用颜色映射对其进行着色:
color = cv2.applyColorMap(normed, cv2.COLORMAP_JET)

enter image description here

我的建议是固定温度范围并剪裁其余值,以获得可以在多个图像或视频之间进行比较的颜色图像。为此,您可以从this answer中借鉴思路,假设您的新最小值和最大值为0和255,而旧的最小值和最大值则是您需要的范围。
更具体地说,在您的情况下,您需要类似于以下内容:
def normalizeImg(low, high, img):
    imgClip = np.clip(img, low, high)
    maxVal = np.max(imgClip)
    minVal = np.min(imgClip)
    return np.uint8((255.)/(maxVal-minVal)*(imgClip-maxVal)+255.)

“low”和“high”是您想要归一化的原始值。然后您可以像这样使用它:
def celsiusToPixel(val):
    return (val + 273.15) / 0.04

rangeToUse = [celsiusToPixel(20), celsiusToPixel(30)] # from 20-30° celsius
normed_range =  normalizeImg(rangeToUse[0], rangeToUse[1], img)

enter image description here

我希望我没有漏掉任何东西,但如果你有问题,请随时问 :)

只有一个小问题。现在我想要的是归一化图像,也就是你发布的第一张图片,但是如何才能将所有图像一起归一化并保存,以便可以在某些软件中可视化呢?这些参数对所有图像都有效吗?我会很感激一个小片段代码。 还有关于彩色图像的评论。如果你注意到,有一个人坐在立着的人旁边的椅子上,在应用颜色后消失了。如何调整参数以确保不会发生这种情况? - rehan

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