[英]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.