基于Python的热图像处理技术研究

阅读: 评论:0

第29卷第3期 2021年6月
Vol.29 No.3Jun. 2021
电脑与信息技术Computer and Information Technology
文章编号:1005-1228(2021)03-0012-04
基于Python 的热图像处理技术研究
陆承佳
(特灵科技亚太研发中心,江苏 苏州 215400)
摘 要:文章介绍了如何基于Python 编程语言开发一个能自动将多张子图像拼接成一张全景图的图像处理工具。该工具能够依次实现多余信息去除、关键点采集、特征匹配、透视变换等功能,最终将局部热图像整合在一起,进而提高用户工作效率与图像准确度。
关键词:Python;热图像;关键点;特征匹配;透视变换;全景图中图分类号:TP391.41  文献标识码:A
The Research on Technology of Thermal Image Processing Based on Python
LU Cheng-jia
(Trane Technologies Engineering & Technology Center-Asia Pacific, Suzhou 215400, China)
Abstract:The paper introduces how to develop an image processing tool to stitch several subimages into a panorama automatically based on Python. This tool can successively realize functions such as redundant information removal, key point collection, feature match, perspective transformation and so on. Finally it will integrate partial thermal images together so as to improve users’ work efficiency and the image accuracy.
Key words:  Python; thermal image; key point; feature match; perspective transformation; panorama
收稿日期:2020-10-12
作者简介:陆承佳(1994-),男,上海人,工程师,本科,主要研究方向为程序设计与软件二次开发。
任何温度高于绝对零度的物体均会产生热辐射,且温度越高,辐射出的能量就越大。而热像仪能够利
用热成像技术,对标的物的红外辐射进行非接触式探测,并将采集到的热量信息转换为能直观反映温度分布情况的热图像。
目前,热成像技术的应用范围已日益广泛,在科研、制造、医疗等领域都发挥了至关重要的作用。然而,受现实因素和测试条件的约束,用户往往无法直接获得满足要求的热图像。例如,当热像仪拍摄角度、距离受限时,便无法获取待测物体正视方向的热图像,甚至需要手动拼接多张不同焦距的局部视图——这些问题不仅会耗费用户大量时间,而且可能对后续分析工作亦造成重大偏差。
本文旨在通过Python 程序设计语言编写一个“热图像处理”工具,自动拼接多张子图像生成一张全景图,从而帮助用户提高工作效率与图像准确度。
1 开发环境简介
Python 是一门非常通用的高级编程语言,凭借其
简洁性、易读性以及可扩展性,它已成为时下最受欢迎的程序设计语言之一[1]。Python 不仅本身内置强大的标准库,可以执行系统管理、文档读写、参数编辑等操作,而且,Python 社区亦提供了大量功能丰富、成熟稳定的第三方模块。
本文使用Python 3.7编写代码,通过引入cv2、numpy 等模块,依次实现去除原始图像多余信息、采
集更新后图像关键点、匹配图像关键特征、将图像透视变换为统一方向、最后整合为全景图的功能。
2 输入图像处理
以如图1所示的微通道换热器为例,在机组实验过程中往往需要使用热像仪测量其温度分布情况,进而判断设备运行状态是否达到性能指标。
然而由于实际测试条件的限制,为确保微通道换热器工况温度免受外界环境影响,即使在探测其热量时仍不能卸下机组外部钣金和隔热棉,仅允许将热像仪伸入几个临时开启的小窗口拍摄局部区域的热图像,最终将多张子图拼接成一张完整的全景图。
第29卷第3期·13·
陆承佳:基于Python 的热图像处理技术研究
图1 微通道换热器正视图
动物添加剂2 局部热图像(左)          图3 局部热图像(右)
一轮拍摄工作便可能获得数十张如图2、3
所示的局部热图像,因此若完全依靠人工拼接这些子图将相当费时费力,同时难以处理由于热像仪拍摄角度偏转而导致的画面透视变换问题。而对于脚本工具,为了能更高效、准确地执行自动化操作,需先去除输入
图像的多余信息,再采集更新后图像的关键点以作为后续拼接步骤的基准。2.1 多余信息去除
因为图像右侧的温度与颜对照图谱仅在分析时起参考作用,所以在拼接过程中只需保留左侧的热图像。同理,图像中央的黑框和温度值也是非必要信息,甚至会对后续的关键点采集造成干扰。为实现上述目标,本文设计了如下代码:
img = cv2.imread('Image.jpg')crop = img[0:1000, 0:1330]for i in range(crop.shape[0]):    for j in range (crop.shape[1]):
if crop[i][j][0] < 50 and crop[i][j][1] < 50 and crop[i][j][2] < 50:
crop[i][j] = crop[i-1][j-1]
程序首先调用OpenCV 库的imread 函数读取待处理图像,从而获得对应的图像对象img。由于原图的尺寸为1633×1000,但其中只有前1330列像素为热图像,因此再截取部分原对象生成了新对象crop。
其次,遍历图中每个像素并将所有判断结果为“黑”
(红、绿、蓝三值均接近0)的像素转化为其左上角像素的颜。最终,去除多余信息的图像如图4、5所示。
图4 更新后热图像(左)      图5 更新后热图像(右)
2.2 关键点采集
因为实际的“拼接”方式是以某一张图像作为源图像,再以它为基准继续处理另一张图(将其转至源图像方向),最终将两图像素融入同一张图中,所以为避免透视变换后的插入图因超出边界而丢失像素,需为第二张图添加额外空间。同时为保证两图拼接时彼此的像素二维坐标匹配,故应对第一张图也执行相同操作。
在采集关键点过程中,本文选择了SIFT(Scale Invariant Feature Transform,尺度不变特征变换)算
法。由于,该算法能够从图像提取对图像尺度和旋转具有不变性,并在光照与三维视点变化的情况下具有部分不变性的特征[2],因此可先将彩图转换为灰度图,再采集关键点。
实现上述操作的参考代码如下:
top, bottom, left, right = 200, 200, 0, 500
srcImg = pyMakeBorder(img1, top, bottom, left, right, cv2.BORDER_CONSTANT, value=(0, 0, 0))
testImg = pyMakeBorder(img2, top, bottom, left, right, cv2.BORDER_CONSTANT, value=(0, 0, 0))
gray1 = cv2.cvtColor(srcImg, cv2.COLOR_BGR2GRAY)gray2 = cv2.cvtColor(testImg, cv2.COLOR_BGR2GRAY)sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(gray1, None)kp2, des2 = sift.detectAndCompute(gray2, None)
勒夫波首先,因为本文的两个例图应按左右拼接,所以调用cv2模块的copyMakeBorder 函数时在图像右侧添加了更多黑像素——具体数值根据实际测试得出,过高或过低都不利于后续工作。其次,需要注意i
mread 函数导入的图像默认为BGR 通道顺序,而不是常见的RGB 模式,故也需在通过cvtColor 函数生成灰度图时设置转换方式为cv2.COLOR_BGR2GRAY。最后,创建sift 对象并利用其detectAndCompute 方法分别获取两张灰度图的“关键点”(Keypoints)及相应
电脑与信息技术 2021年6月·14·
“描述符”(Descriptors)——关键点(kp1 & kp2)列表包含角度、坐标、响应程度等基本信息,而对它们周围邻域内像素进行梯度运算求得的128维特征向量则保存在描述符(des1 & des2)数组中。视具体情况及实际需求,也可采用准确度略逊于SIFT但速度更快的SURF(Speeded Up Robust Features,加速稳健特征)算法[3]。
3 全景图拼接
3.1 特征匹配
二维特征匹配常用的算法有“暴力法”(Brute Force)和“快速近似最近邻库”(Fast Library for Approximate Nearest Neighbors)两种,分别对应OpenCV 库的函数BFMatcher与FlannBasedMatcher。前者尝试所有可能的匹配,从而返回最佳匹配;后者则是一种近似法,旨在到最近邻近似匹配,因此速度也更快。为提高脚本批量处理图像的运行效率,本文选用了FLANN算法获取匹配的特征,示例代码如下:FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_ params)
matches = flann.knnMatch(des1, des2, k=2)
程序首先创建了两组字典作为FlannBasedMatcher 函数初始化flann对象时的输入参数——具体数值同样需要参照实际情况设置以达到准确度与效率的平衡点。其次,使用KNN(K-Nearest Neighbor,K最近邻)算法(即调用flann对象的knnMatch方法)出两图的关键点描述符(des1 & des2)数组中的128维特征向量间欧氏距离最短的两个向量(k=2)——若两图分别有m、n(n≥2)个关键点,则会返回一个包含m个元素的matches列表,每个元素含有最近和次近距离两对向量的匹配信息。但并不是每组匹配都符合要求,还需根据信息做进一步判断。
如图6所示,当最近与次近距离比率等于0.8时,便可在仅丢弃5%正确匹配的前提下,减少90%的错误匹配。在代码中亦采用了类似的方式对匹配进行筛选:
matchesMask = [[0, 0] for i in range(len(matches))]
good = []
for i, (m, n) in enumerate(matches):
if m.distance < 0.7*n.distance:
good.append(m)
matchesMask[i] = [1, 0]
draw_params = dict(matchColor=(0, 255, 0),
singlePointColor=(255, 0, 0),
matchesMask=matchesMask,
flags=0)
img3 = cv2.drawMatchesKnn(gray1, kp1, gray2, kp2, matches, None, **draw_params)
为了尽可能提高匹配正确率,程序只将距离比小于0.7的最近匹配记录进“优良匹配(good)”列表,同时更新对应位置的“掩码(matchesMask)”。最后,调用cv2模块的drawMatchesKnn函数在两张灰度图
上绘制关键点(蓝)和匹配线(绿),如图7所示。
图7  热图像特征匹配结果
3.2 透视变换
当采集到一定数量的优良匹配后,便可根据它们
设计代码进一步分析如何变换第二张图以使其能与第
一张图拼合:
纸币识别器srcPoints = np.float32([kp1[m.queryIdx].pt for m in good]).
reshape(-1, 1, 2)
dstPoints = np.float32([ainIdx].pt for m in good]).
reshape(-1, 1, 2)
M, mask = cv2.findHomography(srcPoints, dstPoints, cv2.
RANSAC, 5.0)
warpImg = cv2.warpPerspective(testImg, M, (testImg.shape[1],
testImg.shape[0]), flags=cv2.WARP_INVERSE_MAP)
图6 距离比率(最近/次近)-概率分布函数图[2]
第29卷第3期·15·
程序首先调用numpy 模块的float32函数分别将两图全部优良匹配关键点的二维坐标转换为标准单精度浮点数,再通过reshape 方法存入m×1×2的三维数组(m=优良匹配数量)[4]。
其次,调用findHomography 函数计算两组关键点的单应性矩阵M。该函数的第三个参数表示具体选用的计算方法,包括:利用所有点的常规方法,基于RANSAC 的鲁棒算法以及最小中值鲁棒算法。其中,RANSAC(Random Sample Consensus,随机抽样一致)算法假设:样本中包含代表正确数据的“内点(inliers)”和被视作异常数据的“外点(outliers)”,同时给定一组含有内点的数据,便可估算出符合正确数据又不受噪声影响的模型——换而言之,保留内点、去除外点。由于“优良匹配”中仍可能存在错误匹配,因此选用RANSAC 算法可进一步提高准确度。而findHomography 函数的第四个参数则表示将点对视为内点的最大允许误差阈值。
最后,将获取的矩阵M 设置为“逆变换(WARP_INVERSE_MAP)”输入warpPerspective 函数,对已按第二节步骤去除多余信息、添加黑边框的第二张热图像进行处理并使其保持原尺寸输出(缺失部分自动转化为黑像素),即可得到根据第一张热图像透视变换的插入图,如图8所示。
石榴套袋技术图8 透视变换后热图像(右)
3.3 像素重组
如2.2所述,所谓的“拼接”实际是以添加了黑边框的图4作为源图像,再将以它为基准处理得到的图8(即插入图)和它的像素整合进同一张图,所以为确定如何在新图像中重组像素,应先求出两图有效部分的相对位置,即两热图像重叠的边界:毛刷制作
rows, cols = srcImg.shape[:2]for col in range(0, cols):
if srcImg[:, col].any() and warpImg[:, col].any():        left = col        break
for col in range(cols-1, 0, -1):
if srcImg[:, col].any() and warpImg[:, col].any():        right = col        break
上述代码旨在先从左至右逐列判断两图当前列是否均有像素不为黑(RGB 三值都等于0),如果是则记录为左(left)边界同时结束当前循环;再从右至左执行相同操作,又可得到右(right)边界——两边界值后续将用于处理两图重叠区域像素。不过鉴于图8中热图像四边并不平行于图框,左右边界的中间区域仅是粗略的重合部分,仍需逐一判断图像每个像素的数值:
result = np.zeros([rows, cols, 3], np.uint8)for row in range(0, rows):    for col in range(0, cols):        if not srcImg[row, col].any():            result[row, col] = warpImg[row, col]        elif not warpImg[row, col].any():            result[row, col] = srcImg[row, col]        else:
srcImgLen = float(abs(col - left))            testImgLen = float(abs(col - right))
alpha = srcImgLen / (srcImgLen + testImgLen)            result[row, col] = np.clip(srcImg[row, col] * (1-alpha) + warpImg[row, col] * alpha, 0, 255)
cv2.imwrite('Result.jpg', result)
程序首先通过numpy 模块的zero 函数初始化了一个尺寸与两图相同的“纯黑”数组result。其次,在像素遍历过程中分三种情况执行不同操作:当源图像像素为黑时,使新数组对应元素等于插入图像素颜值——反之亦然;当两图同一位置像素均非黑(即访问到重叠像素)时,利用上一段代码求得的左右边界值可计算出alpha 通道值(即透明度,取值范
围0~1),再按这一比例混合两像素获得颜值并记录在数组result 内。最后,将该数组转换为图像便可得到拼接完成的全景图,如图9所示。
图9 热图像全景图陆承佳:基于Python
的热图像处理技术研究
(下转第23页)
第29卷第3期·23·
贾丛飞:基于HTTP协议的图片表达方式设计与实现
件读取接口的URL为:IP:Port/ImageReader/file/ read?uuid=uuid值。
(2)重写链接实现伪静态映射
在ImageReader应用内使用urlrewritefilter库,可以增加重写链接的功能。除去urlrewritefilter的基本设置外,还需要在WEB-INF目录中,添加urlrewrite. xml文件。该文件的核心内容为:
<rule>  <from>^/TreeImageCache/[0-9]+/[0-9]+/[0-9]+/[0-9]+/([a-zA-Z0-9\-]+).jpg$</from>
<to type="forward">/file/read?uuid=$1</to>
</rule>
通过这样的配置之后,URL重新调整为如下的形式:
IP:Port/ImageReader/TreeImageCache/年/月/日/时/UUID值.jpg
(3)重写链接清除接口应用名
观察步骤(2)得到的URL,相较于标准的表达方式尚多一个接口应用名字段,还需要通过Tomcat 自带的Rewrite机制清除该接口应用名。
在ROOT应用上启用Rewrite机制,需要修改Tomcat的配置文件l,在适当的位置添加配置内容:
<Context path="/" docBase="ROOT" debug="0" reloadable="true" crossContext="true">
<Valve className="org.apache.catalina.valves. rewrite.RewriteValve"/>
</Context>
为ROOT应用添加Rewrite规则,将ROOT应用下所有的URL都映射到ImageReader应用上。在Tomcat的webapps/ROOT目录下,清空原有的默认内容,创建路径为fig的配置文件,文件内容为:
RewriteRule ^/(.*) /ImageReader/$1
三个步骤完成之后,就通过伪静态映射的方法实现了从标准表达方式向动态接口的关联。需要强调的是,如果将ImageReader应用直接部署在Tomcat的ROOT应用中,则可以省略第三步的配置。
4 结束语
本文中提出了一种基于HTTP协议的图片表达方式。该方式以参数累进形成路径的形式提升了可扩展性;通过静态映射和伪静态映射的方法提供了对本地存储与远程存储的兼容;通过静态路径设置对后端的实际处理流程进行了透明化处理,提升了系统的安全性。。
参考文献:
[1]  王姝贤. 基于Spring MVC框架的图片视频库系统的设计
与实现[D].北京交通大学, 2018.
[2]  周昊. 基于web的图片库设计与实现[D]. 北京交通大学,
2012.
[3]  鲍天赐,刘志刚. 基于HTTP的Web登录安全和模式设计
[J]. 工业控制计算机. 2017(05):99-100.
4 结束语
包装箱制作本文详细介绍了如何基于Python 编程语言对热图像进行自动化处理,实现去除多余信息、采集关键点、匹配特征、透视变换等功能,最终将两张子图像拼接成一张全景图。然而受实际测试中局部热图像质量的影响,该工具可能无法正确、流畅地一次性导出完整热图像。例如,当各组子图像的重合面积不等(热像仪的拍摄角度不定)时,便必须不断调整程序内相应函数的参数,以解决诸如关键点数不足、特征匹配错误、图像超出边框等问题。为了改善这一情况、得到最佳输出结果,同样需要实验员的协助:令拍摄工作标准化,进而获得更便于脚本处理的热图像。
综上所述,本文通过一个完整实例讲解了在图像处理过程中会遇到的常见问题及其解决方案,希望能为类似的技术研究及功能开发提供一定参考。
参考文献:
[1]  B ill Lubanovic. Python语言及其应用[M]. 北京:人民邮电
出版社. 2016.
[2]  L owe, D.G. Distinctive Image Features from Scale-Invariant
Keypoints[J]. International Journal of Computer Vision. 2004.
[3]  B ay, H., Ess, A., Tuytelaars, T., et al. Speeded-Up Robust
Features (SURF) [J]. International Journal on Computer Vision and Image Understanding. 2008.
[4]  W es McKinney. 利用Python进行数据分析[M]. 北京:机械
工业出版社. 2018.
(上接第15页)

本文发布于:2023-08-22 03:05:37,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/2/226960.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   匹配   像素
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图