今天实验跑完后生成了深度图,但是深度图很难看清,所以需要伪彩色增强,搞了半天最后是搞出来了。首先得到深度图后要看位深度是16还是8。一般灰度图位深度是8,但是有一些是16。在转换的时候有可能会出现错误,在做伪色彩增强的时候如果将16位转成8位图像,再用转换来的八位图像做增强的话会出现错误,转换出来的效果就是红色图所示。
而在代码中16位变成8位再增强的话就会得到正确结果,如蓝色图所示。最后分别附上8位图像和16位图像转换的代码
8位图像增强:
import cv2
import os.path
import glob
import numpy as np
from PIL import Image
def convertPNG(pngfile, outdir):
# 读取灰度图
im_depth = cv2.imread(pngfile)
# 转换成伪彩色(之前必须是8位图片)
# 这里有个alpha值,深度图转换伪彩色图的scale可以通过alpha的数值调整,我设置为1,感觉对比度大一些
im_color = cv2.applyColorMap(cv2.convertScaleAbs(im_depth, alpha=1), cv2.COLORMAP_JET)
# 转成png
im = Image.fromarray(im_color)
# 保存图片
im.save(os.path.join(outdir, os.path.basename(pngfile)))
for pngfile in glob.glob("F:/GASDA-master/results/original_02/*.png"):
convertPNG(pngfile, "F:/GASDA-master/results/original_02_result")
16位图像增强:
import cv2
import os.path
import glob
import numpy as np
from PIL import Image
PNG_FILE = 'F:/GASDA-master/results/original_02/*.png'
TARGET_FILE = 'F:/GASDA-master/results/original_02_result'
def convertPNG(pngfile,outdir):
#读取16位深度图(像素范围0~65535),并将其转化为8位(像素范围0~255)
uint16_img = cv2.imread(pngfile, -1) #在cv2.imread参数中加入-1,表示不改变读取图像的类型直接读取,否则默认的读取类型为8位。
uint16_img -= uint16_img.min()
uint16_img = uint16_img / (uint16_img.max() - uint16_img.min())
uint16_img *= 255
#使得越近的地方深度值越大,越远的地方深度值越小,以达到伪彩色图近蓝远红的目的。
uint16_img = 255 - uint16_img
# cv2 中的色度图有十几种,其中最常用的是 cv2.COLORMAP_JET,蓝色表示较高的深度值,红色表示较低的深度值。
# cv.convertScaleAbs() 函数中的 alpha 的大小与深度图中的有效距离有关,如果像我一样默认深度图中的所有深度值都在有效距离内,并已经手动将16位深度转化为了8位深度,则 alpha 可以设为1。
im_color=cv2.applyColorMap(cv2.convertScaleAbs(uint16_img,alpha=1),cv2.COLORMAP_JET)
#convert to mat png
im=Image.fromarray(im_color)
#save image
im.save(os.path.join(outdir,os.path.basename(pngfile)))
print(os.path.basename(pngfile))
for pngfile in glob.glob(PNG_FILE):#C:/Users/BAMBOO/Desktop/source pics/rgbd_6/depth/*.png
convertPNG(pngfile, TARGET_FILE)#C:/Users/BAMBOO/Desktop/source pics/rgbd_6/color
最后做完增强之后就能看的比较清晰了