批量读取液面高度

#批量读取液面高度
研究生0号选手开始做苦力,本次实用语言为matlab,浅浅称这为一代吧,接下来我来介绍一下。
第一步:将实验视频切帧成图片(图片测量液面一定要是有色的)
方法一:matlab切帧,代码在我博客里面找一下
方法二:将视频导入到PR,Ctrl+M切帧,然后得到图片,如果得到图片名字不是连号,转去我的博客自己找怎么连号
总结:两种方法都能用,我发现Pr切帧得到的图可能会有补偿,比matlab得到的图片可能清晰,但是需求不同,方法大家自取
第二步:将图片进行切割,把没需要测量的目标物体切割出来,这里需要人工对比需要切割的范围

clear;clc;
file_path = 'F:\数字图像\40mm\分帧\'; % 设定你存放图片的目录
img_path_list = dir(strcat(file_path, '*.jpg')); % 选后缀为 .jpg 的图片
img_num = length(img_path_list); %获得图片数量

for j = 1:img_num 
    image_name = img_path_list(j).name;
    image = imread(strcat(file_path, image_name));
    crop_image = imcrop(image, [335, 510, 1200, 520]); % 使用 imcrop() 函数来裁剪图片,第二个参数的格式为 [XMIN YMIN WIDTH HEIGHT]
    imwrite(crop_image, strcat('F:\数字图像\40mm\剪切\', image_name)); % 保存文件
end

切割后的图像,沿着容器左下边沿切割,因为要测量容器左边黑色液面高度大家看到我要测量是底部到黑色液面高度所以我沿着容器下边沿切割,具体原因读完你就明白了第三步:将得到的切割后图像二值化

clear;clc;
file_path = 'F:\数字图像\40mm\剪切\'; % 设定你存放图片的目录
img_path_list = dir(strcat(file_path, '*.jpg')); % 选后缀为 .jpg 的图片
img_num = length(img_path_list); %获得图片数量
for j = 1:img_num
      image_name = img_path_list(j).name;%图像名
      I  = imread(strcat(file_path,image_name));
    %转换为灰度图像
    I1=rgb2gray(I);
    sigma = 1;
    gausFilter=fspecial('gaussian',[5 5],sigma);
    I2= imfilter(I1, gausFilter, 'replicate');
    %  figure(2);imshow(I2);title('高斯滤波后图像');
    I3=edge(I2,'Canny',0.1);
    %  figure(3),imshow(I3);title(' Canny边缘检测图像');
    % 孔洞填充
    I41=imfill(I3,'holes');            
    % 提取最外围边缘
    I4=bwperim(I41); 
    % % 去除面积小于950px物体
    I5=bwareaopen(I41,950);%950可调节,根据实际物体大小来测试数值多少
    imwrite(I5, strcat('F:\数字图像\40mm\二值化\', image_name)); % 保存文件 
end

二值化后图片,左上角白色像素就是黑色液体的液面
左上角就是白色像素就是图片高度
第四步:自己数一下左侧页面到底部有多少像素(大家不要真的去数,图片show在窗口),下面的图,加号点一下左下就是最下面的坐标。然后计算一下每个像素点实际对应几厘米(真实液面高度/像素点个数)。我一般都是第一张图片做校准。大家如果有好的想法也可以和我交流一下,考虑如何提升精确度。
加号点一下左下就是最下面的数据
第五步:大家读到这里其实最后一步我不说大家都会了,附上代码吧

clear all;clc;close all;
file_path = 'F:\数字图像\40mm\二值化\'; % 设定你存放图片的目录
img_path_list = dir(strcat(file_path, '*.jpg')); % 选后缀为 .jpg 的图片
img_num = length(img_path_list); %获得图片数量
    for j = 1:img_num
     try    
   image_name = img_path_list(j).name;%图像名
   I  = imread(strcat(file_path,image_name));       
    x=0.69388;  %一个像素点x  mm
    [m,n]=find(I==1);%找出二值图片中白色的点
    [n1,in]=min(m+n);%n1是每列最小值,in是每列最小值索引号 % 找到m数组中最小值
    g = (521- m(in))*x;
   a(j) = g;
    catch
   a(j)=0;  
 continue%假如上面的没法执行则执行continue,到下个循环
     end 
    end

一万五千多张图片处理完接近100张图片测量液面高度为0,不知道为啥,把测量高度为零图片用其他工具测量,大致能看出来液面晃荡频率,需要更高精度。所以,优化ing.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值