图像处理使用ginput粒度分析

8视图(30天)
我们的想法是用一枚硬币作为测量参考,以确定火山灰的大小。
所以硬币的大小并不总是最小或最大图像的一部分,我在我的代码指定这个有困难。我知道有一种方法可以使用函数“ginput”所以我可以有用户iput /选择参考点(硬币)。假设这有与我的道具功能(第85行)。这对我很重要因为我想还保持测量值(您将看到在102年和103年行)这样我就可以用它来测量图像的其他部分(我还是弄清楚怎么做)。开放的建议无论如何测量灰。
将下面的代码和欣赏帮助一如既往。也是上面的图片我用因为我觉得这是一个容易使用。
关闭所有;
清晰的所有;
% %读入图像
RGB = imread (“20210717 _tamarack_1524.jpg”);
%显示图象
图(1);
clf
imshow (RGB)
% %真彩(RGB)图像转换成灰度图像
I = im2gray (RGB);
%使用中值滤波
I = medfilt2(我10 [10]);
图(2);
clf
imshow(我)
% %计算梯度图像并应用一个阈值
%利用边缘和索贝尔算子计算阈值。然后调整阈值,用边缘再次获得一个包含分段二进制掩膜细胞
[~,阈值]=边缘(我“索贝尔”);
fudgeFactor = 1;
受虐妇女综合症=边缘(我“索贝尔”阈值* fudgeFactor);
%显示生成的二进制梯度面具
图(3);
clf
imshow(受虐妇女综合症)
% %扩张的形象。
%使用strel创建两个垂直的线性结构元素的功能。
se90 = strel (“行”,90);
se0 = strel (“行”3 0);
%扩张二元梯度面具使用垂直结构元素随后水平结构元素。imdilate功能扩张的形象。
BWsdil = imdilate(受虐妇女综合症(15日,15));
imshow (BWsdil)
%填补室内空白
使用imfill函数%填补剩余的洞
BWdfill = imfill (BWsdil,“黑洞”);
图(4);
clf
imshow (BWdfill)
% %移除连接对象
%删除任何对象连接到图像的边界
% imclearborder函数。我们使用4作为连接删除2 d对角线
%连接
BWnobord = imclearborder (BWdfill 4);
图(5);
clf
imshow (BWnobord)
% %的对象
%我们使用strel函数创建钻石结构元素
%,使物体看起来自然/光滑
seD = strel (“钻石”1);
BWfinal = imerode (BWnobord, seD);
BWfinal = imerode (BWfinal, seD);
图(6);
clf
imshow (BWfinal)
% %可视化分割
% Labelloverlay函数允许我们显示原始的面具
%的形象
图(7);
clf
BWfinal imshow (labeloverlay(我))
% % bwareafilt函数允许我们过滤图像,保留(10)或n对象
%最大的区域
bwsizefilt = bwareafilt (BWfinal 5);
% bwlabel返回标签矩阵包含标签的L
%在bwsizefilt对象发现
L = bwlabel (bwsizefilt);
图(8);
clf
%保留情节
持有
%使用矩阵中的值创建伪彩色图L
pcolor (L);
集(gca),“ydir”,“反向”)
%色差属性集
阴影
使用regionprops %度量属性的图像区域
%计算质心和面积连接组件的形象。
道具= regionprops (bwsizefilt,“重心”,“区域”,“EquivDiameter”);
i = 1:长度(道具)
情节(道具(i) .Centroid(1),道具(i) .Centroid (2),‘* k”)
结束
% %找出所有的气泡的大小,所以我们知道大小与bwareaopen过滤时使用。
%道具= regionprops(面具,“区域”,“EquivDiameter”,“重心”);
allAreas =排序([props.Area]);
%显示面具的形象。
%次要情节(2,1,2);
%硬币半径,可以改变基于参考
% uiwait(对话框(选择参考点));
% = ginput (1);
pennyRadiusInPixels =道具(3)。EquivDiameter / 2;
pennyRadiusInMm = 19.05 / 2;
%确定点
% (x, y) = ginput (1)
%中心= (x, y);
% viscircles(中心、pennyRadiusInMm '颜色',' b ')
%覆盖圆的形象。
viscircles([道具(3).Centroid(1),道具(3).Centroid (2)), pennyRadiusInPixels,“颜色”,“b”)
返回
%计算空间校正因子。
mmPerPixel = pennyRadiusInMm / pennyRadiusInPixels
次要情节(2,1,2);
标题= sprintf (的空间校准% f毫米每像素的mmPerPixel)
标题(标题,“字形大小”字形大小,“翻译”,“没有”);
%情节的边界气泡在上面的覆盖原始灰度图像
使用bwboundaries返回的坐标()%。
% bwboundaries()返回一个单元阵列,每个单元格包含对象的行/列坐标的图像。
%这里就是我们每个团的边界。
边界= bwboundaries(面具);
%边界单元阵列,每个团的一个细胞。
%在每个单元是一个n除以2的坐标列表(行、列)格式。注意:没有(x, y)。
% 1列是行,或y。第2列列,或x。
numberOfBoundaries =大小(边界,1);%计算边界,所以我们可以使用它在我们的for循环
%这就是我们实际上情节中的每一个blob叠加的界限。
次要情节(2,1,1);
持有;%不要让边界吹走显示图像。
k = 1: numberOfBoundaries
thisBoundary = {k}边界;%获得这个特定的blob的边界。
x = thisBoundary (:, 2);%第2列的列,这是x。
y = thisBoundary (: 1);%第1列的行,这是y。
情节(x, y,的r -,“线宽”2);%绘制边界为红色。
结束
持有;
标题= sprintf (的原始图像% d轮廓,从bwboundaries ()”,numberOfBoundaries);
标题(标题,“字形大小”、字形大小);
轴(“上”,“图像”);%确定图像不是人为紧张因为屏幕的长宽比。
消息= sprintf (“做!空间校准\ nThe % f毫米每像素的mmPerPixel)
uiwait (helpdlg(消息));

答案(1)

图像分析
图像分析 2022年11月2日
看起来像你犯了一个常见的初学者的错误:做一个边缘检测。只是因为你可以看到边缘在图像并不意味着边缘检测是正确的做法。初学者 几乎总是 想做一个边缘检测由于某种原因。也许其他的没有经验的人告诉他们这么做。这通常是 什么是必需的。
首先,我想 使用一个硬币。我有明亮的荧光点贴纸的爱好或办公用品商店比土壤是一个完全不同的颜色。你甚至可以用便利贴。然后发现颜色和你的空间校准。
然后段灰在某些方面有意义的背景区分开来。我不知道,可能因为我不知道什么是火山灰和什么是背景图像。
10评论
沃尔特·罗伯森
沃尔特·罗伯森 2022年11月8日
该文件没有有用的EXIF信息。只是X分辨率和Y决议是名义上的“1”这告诉你什么有用的。

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!