最近在使用我们的新型防堵型释放器做气浮试验,以探究释放器的一些物理特性。其中,气泡沿软管长度的形态变化(气泡量、气泡粒径)需要重点关注。故试验过程中使用单反拍摄了大量(1000张左右)照片,照片如图1所示。软管中有少量粒径较大气泡,大部分粒径较小,较难直接观测。
图1 软管中的气泡分布
为了验证观测的可行性,使用Photoshop调图片的亮度、对比度后进行锐化,锐化图片如图2所示。从锐化图片可以明显看到微小气泡的存在。为了验证统计的可行性,特地让师弟(在这里特别感谢李林原同学)从图片中截取了几个断面做气泡直径分析。气泡直径分析?说起来好像挺高端,其实就是用Photoshop的标尺来量像素。软管的外径是已知的,像素也是可测量的,一个简单的比例的关系就可以算出来气泡大小。
图2 锐化后图片
但进度不是很理想,仅一张图片我师弟就忙活了整整一天,想想夹子里总共1000张左右的图片,就跟他开玩笑说:慢慢数吧,数完了你硕士就毕业了:)
所以痛点就在于方案是可行的,但效率是不足的。正巧手上有一本毛星云著的《OpenCV3编程入门》,OpenCV3在图像处理方面功能还是蛮强大的,Photoshop可以实现的功能,理论上都可以使用OpenCV编码来实现。但OpenCV的短板就在于控件只有一个Slider,功能太过于单一,Label、Button、textbox啥啥的啥都没有,这就需要做一个Client程序来集成OpenCV。读硕士之前及当中我是断断续续做过一年左右的码农的(这里要感谢硕导的开明以及高胜经理的培养),但基本上都是做B/S结构的项目,C/S结构的基本上不怎么涉及,所以选择一个功能强大的,轻量级的,短时间可以上手的桌面环境就极为重要。上述书中使用的环境为VC++,这个环境下貌似只有Windows API和MFC可选择,使用Windows API做桌面程序简直就是噩梦,一条条API慢慢查,慢慢堆,果断放弃。MFC封装好一些,但是学习周期较长,且是上世纪末的产物,现在基本淘汰(当然,市面上还能看到不少MFC的程序,可能也算与老程序员兼容吧:))。在Visual Studio中,还有C sharp可以选择,但C sharp我也不会,且C sharp下如何调用OpenCV我也完全没有概念。最终,我还是把注意力集中在了Pyqt上,我其实从博一就开始关注Pyqt了,只是一直也没有地方用,所以也就只是看看了文档和例程,仅仅有些感性认识。Pyqt的优点在于:1、可移植性好;2、与Python的兼容性高;3、Python牛逼性强;4、门槛低;关于可移植性,Pyqt脱胎于qt,Windows、Linux(包括类Linux,如MAC)、Android通吃,完全是一处编码,处处运行。关于Python的牛逼之处,我就不多说了,搞科研的都懂。关于门槛低,Pyqt本身还带辅助界面设计程序Qt designer,使用pyuic5可以直接将生成的UI文件转换成py文件,直接在py文件里面写逻辑就行。做出来的第一个版本如图3所示。
图3 第一版程序
本来想将图片加载后在图中的QLabel(也就是灰框框)里面显示,但我显然还是太高估了自己的水平(也是因为对Pyqt、Python、numpy根本不熟),所以最终还是选择了妥协,使用OpenCV的imshow()来显示图片。如何显示不重要,重要的是功能的实现。
图4 第二版程序
当功能基本都实现后,还是对UI进行了调整,调整后的程序如图5所示。
图5 第三版程序
到这里,就基本上搞定了,识别出来的气泡边缘如图6所示(这是原照片中的一个小的局部,本来识别出来的气泡应该是圆形的,但由于拍摄设备能力有限,以及光影、折射、散射、算法等因素的原因,导致识别出来的气泡并不圆,不过由于气泡本身直径非常小,这些误差暂时忽略不计)。
图6 气泡边缘识别图
边缘特征参数记录如图7所示。