【问题标题】:What's the proper way to colorize a 16-bit depth image?为 16 位深度图像着色的正确方法是什么?
【发布时间】:2021-08-13 02:40:53
【问题描述】:

我有一个来自 ifm 3D 相机的深度图像,它利用飞行时间概念来捕捉深度图像。相机附带一个软件,可以展示如下所示的图像:

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

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)

这让我得到以下图像:

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

我还上传了深度图像文件以防万一: depth_image

对此的任何帮助将不胜感激。

【问题讨论】:

  • 看看this的帖子。
  • 在展示应用程序中,看起来仅使用了大约 1.44 - 1.58 的值范围(请参阅窗口底部的宏/微滑块),因此您的规范化应该转换为 64位浮点数,减去 1.44,除以 0.14 并乘以 1(或省略)。然后应用浮点颜色图(0 到 1 输入范围)。
  • 要应用的颜色图可以是 RAINBOW 或 JET(反转):docs.opencv.org/master/d3/d50/group__imgproc__colormap.html
  • 软件中显示的图片和您提供的示例图片不一样。当您在软件中查看示例图像时,中心的黑暗是否会出现?
  • 抱歉,回复晚了。是的,这是不同的图像,但只是相机下方的收银台配置不同。图像采集是一样的。摄像头正好设置在距离桌子 1.5 米的高度。

标签: python opencv image-processing colors computer-vision


【解决方案1】:

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

输入:

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()

拉伸图像:

彩色图像:

LUT:

【讨论】:

  • 您的彩色图像与问题中的彩色图像差不多。不过,我想知道——是否不需要考虑选择的 1.44 和 1.58 范围?
  • 这些数字代表什么?什么规模?是那个高度吗?它是什么?要正确执行此操作,您需要知道该工具如何设置比例以及所使用的确切颜色图。
  • 这些是最小:1426 和最大:1791 高度。所以 1.426 到 1.791 千单位(英尺还是米?)。因此,从红色到紫色,它们的比例从 1.44 到 1.58。所以是的,需要调整以拉伸和剪辑这些值。这可以通过 skimage.exposure.rescale_intensity() in_range 值来完成。
  • 非常感谢您的回答 fmw42。这是我以前从未见过的方法。不过,我还不清楚一件事。为什么在您的图像(以及我尝试过的其他图像)中,图像的中心较暗,边缘较亮?即使我直接从相机获取相同的深度数据,软件表示中也没有看到?
  • 我无法回答。我不知道他们在应用颜色图之前可能会进行哪些其他处理,也不知道他们的颜色图颜色。
猜你喜欢
  • 2017-07-31
  • 1970-01-01
  • 2011-04-23
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 2020-05-02
相关资源
最近更新 更多