16位深度图像的正确着色方法是什么?

2024-04-23 10:17:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个来自ifm 3D相机的深度图像,它利用飞行时间概念来捕捉深度图像。相机附带一个显示图像的软件,如下图所示: Depth image of 12 randomly arranged tills

我可以从相机中提取深度数据,并一直试图重新创建它们的表示,但我没有成功。无论我如何尝试规范化数据范围或更改数据类型格式,最终得到的图像中心总是“较暗”,并且随着图像移动而变亮。由于某种原因,颜色范围也不匹配。以下是我尝试的主要代码:

gray_dist = cv2.imread(dist_path, cv2.IMREAD_ANYDEPTH)

# cv2.normalize(dist, dist, 0, 65535, cv2.NORM_MINMAX)
# cv2.normalize(dist, dist, 0, 255, cv2.NORM_MINMAX)
cv2.normalize(dist, dist, 1440, 1580, cv2.NORM_MINMAX)

dist = dist.astype(np.uint8)
dist = cv2.applyColorMap(dist, cv2.COLORMAP_HSV)
# dist = cv2.cvtColor(dist, cv2.COLOR_HSV2BGR)

cv2.imshow("out", dist)
cv2.waitKey(0)

这让我看到了下面的图像:

HSV color map

我尝试了其他组合,也编写了自己的规范化和着色函数,但得到了相同的结果。在这一点上,我不确定我是否做错了什么,或者这是openCV窗口查看器的限制还是其他什么

我还上传了深度图像文件,以防有用: depth_image

在此方面的任何帮助都将不胜感激


Tags: 数据图像概念利用norm软件dist时间
1条回答
网友
1楼 · 发布于 2024-04-23 10:17:54

在Python/OpenCV中有一种方法。它并不精确,但您可以修改颜色贴图或更改拉伸。基本上,我创建了7种颜色的LUT:红色、橙色、黄色、蓝色和紫色。我注意到,使用HSV将在两端产生红色,而您使用的颜色贴图仅从红色变为紫色。我也不太看好绿色。所以我把它忘了

输入:

enter image description here

import numpy as np
import skimage.exposure

# load image as grayscale
img = cv2.imread("dist_img.png", cv2.IMREAD_ANYDEPTH)

# stretch to full dynamic range
stretch = skimage.exposure.rescale_intensity(img, in_range='image', out_range=(0,255)).astype(np.uint8)

# convert to 3 channels
stretch = cv2.merge([stretch,stretch,stretch])

# define colors
color1 = (0, 0, 255)     #red
color2 = (0, 165, 255)   #orange
color3 = (0, 255, 255)   #yellow
color4 = (255, 255, 0)   #cyan
color5 = (255, 0, 0)     #blue
color6 = (128, 64, 64)   #violet
colorArr = np.array([[color1, color2, color3, color4, color5, color6]], dtype=np.uint8)

# resize lut to 256 (or more) values
lut = cv2.resize(colorArr, (256,1), interpolation = cv2.INTER_LINEAR)

# apply lut
result = cv2.LUT(stretch, lut)

# create gradient image
grad = np.linspace(0, 255, 512, dtype=np.uint8)
grad = np.tile(grad, (20,1))
grad = cv2.merge([grad,grad,grad])

# apply lut to gradient for viewing
grad_colored = cv2.LUT(grad, lut)

# save result
cv2.imwrite('dist_img_colorized.png', result)
cv2.imwrite('dist_img_lut.png', grad_colored)

# display result
cv2.imshow('RESULT', result)
cv2.imshow('LUT', grad_colored)
cv2.waitKey(0)
cv2.destroyAllWindows()

拉伸图像:

enter image description here

彩色图像:

enter image description here

LUT:

enter image description here

相关问题 更多 >