繁体   English   中英

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

[英]How to visualize a 16-bit grayscale image with cv2.imshow()?

我有一组tiff格式的灰度无人机图像,具有 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

图像应如下所示。 这是用另一个软件打开的,只是为了视觉目的

在此处输入图片说明

正如您之前所说,加载很容易:

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)

在此处输入图片说明

之后,您可以使用颜色图为它着色:

color = cv2.applyColorMap(normed, cv2.COLORMAP_JET)

在此处输入图片说明

我的建议是修复温度范围并剪辑其余的值,以获得可以在多个图像或视频之间进行比较的颜色的图像。 为此,您可以从这个答案中获取想法,假设您的新最小值和最大值分别为 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.)

低和高是您想要标准化的原始值。 然后你像这样使用它:

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)

在此处输入图片说明

我希望没有遗漏任何东西,但是如果您有任何疑问,请提问:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM