从图像计算蒸发水滴直径和体积
20视图(30天)
显示旧的评论
JUBAIR艾哈迈德、
2022年2月2日
大家好!
我想计算滴水直径与时间和体积与时间的顺序由CCD摄像机拍摄的蒸发液滴速度50帧/秒。我将此4时间序列图像的蒸发掉。基本上,它是一种润湿的研究过渡蒸发从Cassie-Baxter文策尔状态下降的超疏水表面。
与这样的图像处理,如果有人能帮我我将感激我们也可以讨论潜在的科研合作类似的主题。
接受的答案
图像分析
2022年2月2日
很多方法可以做到这一点。我可以试一试imfindcircles ()。
如果不工作,你可以
- 阈值找到黑暗的东西
- 调用imfill()来填补黑暗滴
- 和图像水平发现躺在下降。
- 从这一点抹去。
- 跨列的列扫描发现的顶部剪,圆形的斑点。
- 使用常见问题https://matlab.fandom.com/wiki/FAQ How_can_I_fit_a_circle_to_a_set_of_XY_data.3F适合那些坐标一个圈。
如果你想不出来,我看看我能做以后,我有更多的时间。
3评论
JUBAIR艾哈迈德、
2022年2月3日
亲爱的图像分析,非常感谢你的评论和指导。我写了一个简单的代码。我试着你的第一个建议imfindcircles()和它很容易。代码在下降时没问题的大小更大(在图像static-1_R0003C01.bmp)。但当下降很小(static-1_R0043C01.bmp),我需要降低Rmin半径范围,它检测到两个圆(另一个下降的反射)如附件图片所示(result_43)。有时白色区域内也发现圆根据范围。
反正有检测只有一个圆在每张图片?例如,填补内心的白色区域,消除反射等。我再次感谢你的帮助。非常感谢您valubale时间和支持。金宝app
图像分析
2022年2月3日
试试这个:
%演示图像分析
clc;%清除命令窗口。
关闭所有;%关闭所有数据(除了imtool。)
清晰;%擦掉所有现有的变量。或者clearvars如果你想要的。
工作空间;%确定工作区面板显示。
格式长g;
格式紧凑的;
字形大小= 22;
markerSize = 40;
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%读入图像
文件夹= pwd;
baseFileName =“static-1_R0043C01.bmp”;
fullFileName = fullfile(文件夹,baseFileName);
%检查文件是否存在。
如果~存在(fullFileName“文件”)
%的文件不存在,没有找到它在该文件夹。
%检查整个搜索路径(其他文件夹)去掉文件的文件夹。
fullFileNameOnSearchPath = baseFileName;%没有路径。
如果~存在(fullFileNameOnSearchPath“文件”)
%仍然没有找到它。提醒用户。
errorMessage = sprintf (的错误:% s在搜索路径的文件夹不存在。,fullFileName);
uiwait (warndlg (errorMessage));
返回;
结束
结束
rgbImage = imread (fullFileName);
%得到图像的尺寸。
% numberOfColorChannels应该为灰度图像,= 1和3的RGB彩色图像。
(行、列,numberOfColorChannels) =大小(rgbImage)
如果numberOfColorChannels > 1
%这不是灰度像我们预期的颜色。
%提取蓝色通道。
grayImage = rgbImage (:: 3);
其他的
grayImage = rgbImage;
结束
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%显示图像。
次要情节(2、3、1);
imshow (grayImage);
impixelinfo;
轴(“上”,“图像”);
标题(的原始灰度图像,“字形大小”字形大小,“翻译”,“没有”);
持有在
%最大化窗口。
g = gcf;
g。WindowState =“最大化”
drawnow;
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%得到一个直方图
次要情节(2、3、2);
imhist (grayImage);
网格在;
标题(原始灰度图像的直方图,“字形大小”字形大小,“翻译”,“没有”);
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%为每个级别设置阈值。
upperMeanGL =非常刻薄(grayImage(1:地板(行/ 2):));
lowThreshold = upperMeanGL;%的平均图像的上半部分。
highThreshold = 255;
%交互和视觉上设置一个阈值灰度图像。
% //www.tatmou.com/matlabcentral/fileexchange/29372-thresholding-an-image?s_tid=srchtitle
% (lowThreshold highThreshold] =阈值(255年lowThreshold grayImage)
%画出直方图阈值线。
参照线(lowThreshold“颜色”,“r”,“线宽”2);
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% Binarize图像掩模。
掩码= grayImage > = lowThreshold & grayImage < = highThreshold;
= imfill(面具,面具“黑洞”);
%最大团。
掩码= bwareafilt(面具,1);
%显示面具的形象。
次要情节(2、3、3);
imshow(面具);
impixelinfo;
轴(“上”,“图像”);
drawnow;
标题= sprintf (“阈值= % d像素”,lowThreshold);
标题(标题,“字形大小”字形大小,“翻译”,“没有”);
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%删除下面的部分通过设置它为白色。
%最低边界扫描
bottomRows = 1(1,列);
为坳= 1:列
bottomRows (col) =找到(面具(:,上校),1,“最后一次”);
结束
%我们不想填写滴,所以我们需要配合底部边界多项式。
x = 1:列;
系数= polyfit (x bottomRows 3);
yFit = polyval(系数x);
持有在;
情节(x, yFit,的r -,“线宽”2);
%现在大权的面具下面的行。
为坳= 1:列
面具(圆(yFit (col)):最终,上校)= true;
% grayImage(圆(yFit (col)):最终,上校)= upperMeanGL;
结束
%转化的面具滴而不是背景。
掩码= imclearborder面具(~);
掩码= bwareafilt(面具,1);%最大团。
%显示新的面具的形象。
次要情节(2、3、4);
imshow(面具);
impixelinfo;
轴(“上”,“图像”);
drawnow;
标题(“新面具”,“字形大小”字形大小,“翻译”,“没有”);
%显示灰度图像。
次要情节(2、3、5);
imshow (grayImage);
impixelinfo;
轴(“上”,“图像”);
drawnow;
标题(“新形象”,“字形大小”字形大小,“翻译”,“没有”);
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%的边界
%情节的边界气泡在上面的覆盖原始灰度图像
使用bwboundaries返回的坐标()%。
% bwboundaries()返回一个单元阵列,每个单元格包含对象的行/列坐标的图像。
% imshow (grayImage);%可选:显示原始图像。或者你可以把二进制图像显示如果你想。
%这里就是我们每个团的边界。
边界= bwboundaries(面具);
%边界单元阵列,每个团的一个细胞。
%在每个单元是一个n除以2的坐标列表(行、列)格式。注意:没有(x, y)。
% 1列是行,或y。第2列列,或x。
numberOfBoundaries =大小(边界,1);%计算边界,所以我们可以使用它在我们的for循环
%这就是我们实际上情节中的每一个blob叠加的界限。
持有在;%不要让边界吹走显示图像。
为k = 1: numberOfBoundaries
thisBoundary = {k}边界;%获得这个特定的blob的边界。
xb = thisBoundary (:, 2);%第2列的列,这是x。
yb = thisBoundary (: 1);%第1列的行,这是y。
情节(xb, yb,的r -,“线宽”2);%绘制边界为红色。
结束
持有从;
标题= sprintf (' % d轮廓,从bwboundaries () ',numberOfBoundaries);
字形大小= 15;
标题(标题,“字形大小”、字形大小);
轴(“上”,“图像”);%确定图像不是人为紧张因为屏幕的长宽比。
%现在有一些变形和压扁的圆底部我们得到的坐标
%的顶部,说,80%的人。
indexesOfUpper = yb < min (yb) + 0.80 * (max (yb) - min (yb));
xb = xb (indexesOfUpper);
yb = yb (indexesOfUpper);
%配合这些一圈;
半径,[xCenter yCenter] = circlefit (xb,)
%显示灰度图像。
次要情节(2、3、6);
imshow (grayImage);
impixelinfo;
轴(“上”,“图像”);
drawnow;
%显示圆viscircles ()
viscircles ([xCenter, yCenter],半径,“颜色”,“r”);
标题= sprintf (= % f像素半径的、半径);
标题(标题,“字形大小”字形大小,“翻译”,“没有”);
uiwait(对话框(“干!”))
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
函数半径,[xCenter yCenter] = circlefit (x, y)
% circlefit():适合一圈通过x - y平面上的点的集合。
%用法:
% (xCenter yCenter,半径,]= circlefit (X, Y)
%的输出是中心点(xCenter yCenter)和拟合圆的半径。
%”“是一个可选的输出向量描述圆的方程的系数:
% x ^ 2 + y ^ 2 + (1) * x + y (2) * + (3) = 0
%,布赫Izhak 25 - 10月- 1991
numPoints =元素个数(x);
xx x = x。*;
yy = y。* y;
xy y = x。*;
=(和(x)和(y), numPoints;
和(xy)和(yy)和(y);
和(xx)和(xy)和(x)];
B =[总和(xx + yy);
总和(xx。* y + yy。* y);
总和(xx。* x + xy。* y)];
= \ B;
xCenter = -。5 * (1);
yCenter = -。5 * (2);
半径=√(1)^ 2 + (2)^ 2)/ 4 - (3));
结束
更多的答案(0)
一个错误发生
无法完成的行动,因为页面所做的更改。重新加载页面更新状态。
你也可以从下面的列表中选择一个网站
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。