基于Python+Pyqt+Opencv的气浮图片气泡特征识别

       最近在使用我们的新型防堵型释放器做气浮试验,以探究释放器的一些物理特性。其中,气泡沿软管长度的形态变化(气泡量、气泡粒径)需要重点关注。故试验过程中使用单反拍摄了大量(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所示。

                              

                         

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
车辆识别系统通常包含三部分:图像处理、特征提取和分类识别。下面是一个基于Python+PyQt5+API的简单车辆识别系统的实现: 1. 图像处理 使用OpenCV库实现图像处理,包括读取图像、调整图像大小、图像灰度化、二值化、边缘检测等。 ```python import cv2 def preprocess_image(image_path): """ 对图像进行预处理 """ # 读取图像 image = cv2.imread(image_path) # 调整图像大小 image = cv2.resize(image, (800, 600)) # 灰度化 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 二值化 _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 边缘检测 edge = cv2.Canny(binary, 50, 150) return edge ``` 2. 特征提取 使用深度学习模型提取图像特征。这里使用已经训练好的VGG16模型作为特征提取器。 ```python import numpy as np from keras.applications.vgg16 import VGG16, preprocess_input from keras.models import Model def extract_features(image): """ 使用VGG16模型提取图像特征 """ # 加载VGG16模型 base_model = VGG16(weights='imagenet') # 截取VGG16模型的倒数第二层作为特征提取器 feature_extractor = Model(inputs=base_model.input, outputs=base_model.get_layer('fc2').output) # 对图像进行预处理 image = np.expand_dims(image, axis=0) image = preprocess_input(image) # 提取特征 features = feature_extractor.predict(image) return features.flatten() ``` 3. 分类识别 使用训练好的分类器进行车辆识别。这里使用SVM模型作为分类器。 ```python from sklearn.externals import joblib def recognize_vehicle(image_path): """ 车辆识别 """ # 图像预处理 image = preprocess_image(image_path) # 提取特征 features = extract_features(image) # 加载SVM模型 svm_model = joblib.load('svm_model.pkl') # 进行分类识别 prediction = svm_model.predict([features]) return prediction[0] ``` 4. 编写GUI界面 使用PyQt5库编写GUI界面,包括文件选择、图像显示、车辆识别按钮等。 ```python import sys from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QPushButton, QFileDialog, QHBoxLayout, QVBoxLayout from PyQt5.QtGui import QPixmap class VehicleRecognition(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 创建文件选择按钮 self.selectButton = QPushButton('选择图片', self) self.selectButton.clicked.connect(self.showFileDialog) # 创建车辆识别按钮 self.recognizeButton = QPushButton('车辆识别', self) self.recognizeButton.clicked.connect(self.recognizeVehicle) # 创建图像显示区域 self.imageLabel = QLabel(self) # 创建布局 hbox = QHBoxLayout() hbox.addWidget(self.selectButton) hbox.addWidget(self.recognizeButton) vbox = QVBoxLayout() vbox.addLayout(hbox) vbox.addWidget(self.imageLabel) self.setLayout(vbox) # 设置窗口属性 self.setGeometry(300, 300, 800, 600) self.setWindowTitle('车辆识别系统') self.show() def showFileDialog(self): """ 显示文件选择对话框 """ options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getOpenFileName(self,"选择图片","./","Images (*.png *.xpm *.jpg)", options=options) if fileName: self.imageLabel.setPixmap(QPixmap(fileName).scaled(800, 600)) def recognizeVehicle(self): """ 进行车辆识别 """ image_path = self.imageLabel.pixmap().toImage() prediction = recognize_vehicle(image_path) self.setWindowTitle('车辆识别系统 - ' + prediction) if __name__ == '__main__': app = QApplication(sys.argv) ex = VehicleRecognition() sys.exit(app.exec_()) ``` 这样,我们就完成了一个基于Python+PyQt5+API的简单车辆识别系统。需要注意的是,这个系统只是一个简单的示例,实际应用中可能需要更复杂的图像处理和更精准的分类识别算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值