喷雾宏观特性参数获取(喷雾贯穿距离、喷雾锥角、喷雾面积)
文中出现的程序只针对某一张图片,未将批处理程序完整贴出
喷雾图像处理介绍见:https://blog.csdn.net/yusuhuayu/article/details/115458959
根据实际需求,在获取宏观参数之前根据所获取的图像进行处理
-
图像减去背景,去除喷嘴及其他背景干扰
imsubtract()
。I0=imread('0.tif'); %读取背景图 I1=imread('1.tif'); %读取喷雾图 I=imsubtract(I1,I0); %减去背景
-
裁剪图片,得到合适的尺寸
imcrop()
。
为方便后续计算,此处选取的图片起点纵坐标与喷嘴纵坐标一致。rect=[151 42 200 359]; %[起点坐标 宽度 长度] I = imcrop(I,rect); %裁剪图片
-
提高精度,调整图片深度(如果原图像为RGB图像,需要先获取灰度图
rgb2gray()
)。
我的原图像为12位的灰度图,为了方便后期处理,转换为8位。方法有如下两种,原理如下:- 获取图片最大亮度值,作为8位灰度图的最大亮度,其余等比例转换。此方法可以较好地保留图像的细节,但为了后期的边缘检测还需要提高亮度,调整对比度。
- 直接使用
uint8()
函数,大于255的值设置为255,小于0的值设置为0,其余不变。对于喷雾图像,此方法变相提高了整体的亮度,虽然损失了较多的图像细节,但有利于后期进行边缘检测。
两种方法对比图如下:
代码如下,按需采用:
I=double(I); %提高计算精度 m=max(max(I)); img=uint8((I.*(256/(m+1)))); %调整图片到8位 R=uint8(I);
-
获取二值图并进行边缘检测
为方便处理,直接采用自动获取阈值的方式,并通过形态学处理,填补二值图中出现的空洞。
代码如下:T = graythresh(R); %自动获取阈值 大津法 OTSU = im2bw(R,T); %获取二值图 OTSU1=imfill(OTSU,'hole'); %填充图像中的空洞区域 se=strel('disk',5); %创建半径为5的圆盘型结构 OTSU1=imclose(OTSU1,se); %形态学闭运算,先膨胀后腐蚀
未经形态学处理进行边缘检测,效果较差,除喷雾的外部轮廓以外,空洞的轮廓也被检测出来。形态学处理后,只保留喷雾外部轮廓,且采用canny算子,效果较好。对比如下图:
获取宏观参数
- 喷雾贯穿距离(Spray Penetration)
贯穿距有两种计算方式:喷嘴到喷雾最末端的距离;喷嘴到喷嘴所在铅垂线与喷雾前锋面交点的距离。本文采用第一种。
获取图像边缘后,只需要找到喷雾最末端的纵坐标即可。[hs,ls]=find(canny==1); %返回边界像素点所在的行数列数 pl=max(hs); P=pl/k; %喷雾贯穿距,k为像素数与实际距离的比值
- 喷雾锥角(Spray Angle)
从喷嘴出口沿着喷雾边界到S/2 处的两条切线所形成的角度。(喷雾锥角有多种表示方法,此处非最优)yhalf=idivide(int16(pl),2,'fix'); %贯穿距一半处的纵坐标,截断取整 x=find(canny(yhalf,:)==1); %贯穿距一半处边界横坐标 x=[min(x),max(x)]; alpha=atan(abs((x0-x)/double((yhalf)))); %x0为喷嘴横坐标 Angle=rad2deg(sum(alpha));
- 喷雾面积(Spray Area)
Area=sum(OTSU(:))*((1/k)^2); %计算像素数。并进行换算
通过亮度与对比度的调整(ps或matlab),可以使处理后的二值图更接近原始的喷雾图像,减小误差。
手动测量与程序计算结果对比(获取二值图前调整了亮度):