前面写了一个将三通道的热红外照片(R_JPEG)转成单通道TIF图像,使单通道TIF图像中每个像素的数值不是表示颜色(0-255),而是表示了温度(数值范围大很多),最后将TIF拼接成完整影像的方法。这个方法步骤多,比较繁琐,下面介绍一个更简单的方法
系统:windows 10 64位
TSDK版本:dji_thermal_sdk_v1.4_20220929
大疆智图版本:DJI Terra 4.0.1
Pix4D mapper版本:4.4.12
PyCharm版本:2023
1.下载TSDK,编写python脚本代码
下载大疆TSDK(版本dji_thermal_sdk_v1.4_20220929)解压缩,新建工程项目,将解压缩的文件夹dji_thermal_sdk_v1.4_20220929复制粘贴放入项目文件夹中,然后编写python脚本代码
TSDK和脚本在同一个文件夹即可
def get_platform():
return platform.system()
def mkdir(path):
isExists = os.path.exists(path)
if not isExists:
os.makedirs(path)
print(f"Successfully create path: {path}")
return True
else:
shutil.rmtree(path)
os.makedirs(path)
print(f"Path: {path} already exists, delete and create again.")
return False
def jpg2tiff(inputpath, outpath, **kwargs):
# 代码可私聊我
*****
*****
def run(input_dir, output_dir, **kwargs):
# 代码可私聊我
*****
*****
运行代码就可以将R_JPG图像转换为TIF格式的图像了,
TIF图像中每个像素的数据不再表示颜色信息,而是表示了温度,转化完成后的TIF图像可以保留原始图像的位置信息。
如果不会调节参数或者无论怎么调节参数转换得到的温度图像的温度值与实际相差太大,有这样的一个解决办法:(1)在拍摄地点中找一个易于手动测量温度的一个地点,在图像中找到对应位置;(2)等到一个天气与拍摄天气一样的日子,在同样的时间在指定的地点测量实际温度(物体表面温度,不要测量物体上方空气温度);(3)计算图像温度值与测量得到的值的比例关系;(3)设计算法将所有温度图像按照比例关系调整温度。该方法我已经试过,不会丢失图像的GPS等信息。
注意:转换后的图像格式可以是TIF,也可以是TIFF,转成什么格式看自己需要。TIF格式的温度图像可以使用大疆智图软件进行拼接,可以不用pix4D,对于不熟悉pix4D软件的人比较友好一些。TIFF格式的图像无法在大疆智图里面拼接,可以使用pix4D进行拼接。
2.使用pix4D mapper拼接TIFF图像
在pix4D mapper中导入的TIF图像
可以看到有位置信息,但是没有相机型号、俯仰角、翻滚角、航偏角等信息,这些缺失的信息可以补回来。
第一步,使用大疆智图导出R_JPG图像的pos信息
导出的pos.txt包含的信息
第二步,使用python代码编辑pos信息
import os
path = 'post/'
pos_path = 'post/'
posread = os.path.join(pos_path, "pos.txt")
f = open(posread, encoding='utf8')
poswrite = os.path.join(path, "posT.txt")
for line in f:
if "D" in line:
# 获取 name 字段
i1 = line.find(",") # 获取 ',' 的索引
line1 = line[i1 - 12:i1 - 4] # 获取剩余部分
# 获取 lat 字段
line2 = line[i1 + 1:]
i2 = line2.find(",") # 获取 ',' 的索引
line3 = line2[i2 + 1:] # 获取 'lat' 字段
line2 = line2[:i2] # 截取 'lat' 字段之前的部分
# 获取 lon 字段
i3 = line3.find(",")
line4 = line3[i3 + 1:]
line3 = line3[:i3]
# 获取 altitude 字段
i4 = line4.find(",")
line5 = line4[i4 + 1:]
line4 = line4[:i4]
# 获取 yaw 字段
i5 = line5.find(",")
line6 = line5[i5 + 1:]
line5 = line5[:i5]
# 获取 pitch 字段
i6 = line6.find(",")
line7 = line6[i6 + 1:]
line6 = line6[:i6]
i7 = line7.find(",")
line8 = line7[i7 + 1:]
line7 = line7[:i7]
i8 = line8.find(",")
line9 = line8[i8 + 1:]
line8 = line8[:i8]
i9 = len(line9)
line9 = line9[:i9 - 1]
line = line1 + '.tif ' + line2 + ' ' + line3 + ' ' + line4 + ' ' + line6 + ' ' + line5 + ' ' + line7 + ' ' + line8 + ' ' + line9 # for pix
print(line)
with open(poswrite, "a") as fs:
fs.write(line + "\n")
f.close()
第三步,在pix4D mapper拼图的时候选择定位信息文件后拼图即可
3.使用大疆智图拼接TIF图像
自行网上找教程吧,这个不难。
。。。。。。
至此,处理完毕
文中不可避免地可能会有一些错误或遗漏的地方。如果有什么问题请在评论区留言