#批量读取液面高度
研究生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.