图像处理使用ginput粒度分析

5次浏览(过去30天)
这个想法是使用一枚硬币作为测量基准,以确定灰烬的大小。
所以硬币的大小并不总是图像中最小或最大的部分,我在代码中很难指定这一点。我知道有一种方法,我可以使用“ginput”函数,这样我就可以让用户iput/选择参考点(硬币)。假设这与我的props函数有关(第85行之后)。这对我来说很重要,因为我还想保持测量值(正如您将在第102和103行中看到的那样),这样我就可以使用它来测量图像的其他部分(我仍在研究如何做)。对测量火山灰的方法也持开放态度。
将张贴下面的代码,感谢帮助一如既往。另外,我使用的图像是上面的,因为我觉得这是一个更容易使用的。
关闭所有
清晰的所有
%%在映像中读取
RGB = imread(“20210717 _tamarack_1524.jpg”);
%显示图像
图(1);
clf
imshow (RGB)
将真彩色(RGB)图像转换为灰度图像
I = im2gray(RGB);
%使用中值过滤器
I = medfilt2(I,[10 10]);
图(2);
clf
imshow(我)
计算梯度图像并应用阈值
使用边缘和Sobel算子计算阈值。然后调优阈值,再次使用edge获得包含分割单元格的二进制掩码
[~,threshold] = edge(I,“索贝尔”);
fudgeFactor = 1;
BWs =边(I,“索贝尔”,阈值* fudgeFactor);
显示结果二元渐变蒙版
图(3);
clf
imshow(受虐妇女综合症)
%%放大图像。
使用strel函数创建两个垂直的线性结构元素。
Se90 = strel(“行”, 90);
Se0 = strel(“行”3 0);
使用垂直结构元素和水平结构元素来扩展二元渐变蒙版。膨胀函数使图像膨胀。
BWsdil = imdilate(BWs,ones(15,15));
imshow (BWsdil)
%填充内部缝隙
使用填充功能填充剩余的孔
BWdfill = imfill(BWsdil,“黑洞”);
图(4);
clf
imshow (BWdfill)
移除连接对象
删除连接到图像边界的任何对象使用
% imclearborder函数。我们用4作为连通性来去除2D对角线
%连接
bwnoboard = imclearborder(BWdfill,4);
图(5);
clf
imshow (BWnobord)
平滑对象
我们使用中的strel函数创建金刚石结构元素
为了使物体看起来自然/光滑
seD = strel(“钻石”1);
BWfinal = imerosion (bwnoboard,seD);
BWfinal = imerosion (BWfinal,seD);
图(6);
clf
imshow (BWfinal)
可视化分割
% labeloverlay函数允许我们在原图上显示蒙版
%的形象
图(7);
clf
BWfinal imshow (labeloverlay(我))
%% bwareafilt函数允许我们过滤图像,保留(10)或n个对象
%最大面积
bwsizefilt = bwareafilt(BWfinal, 5);
的标签返回标签矩阵L,其中包含
%在bwsizefilt中找到的对象
L = bwlabel(bwsizefilt);
图(8);
clf
%保留图
持有
使用矩阵L中的值创建伪彩色图
pcolor (L);
集(gca),“ydir”“反向”
设置颜色阴影属性
阴影
使用regionprops测量图像区域的属性
计算图像中连接组件的质心和面积。
Props = regionprops(bwsizefilt,“重心”“区域”“EquivDiameter”);
I = 1:长度(道具)
情节(道具(i) .Centroid(1),道具(i) .Centroid (2),‘* k”
结束
找出所有blob的大小,这样我们就知道在使用bwareaopen过滤时使用什么大小。
% props = regionprops(mask, 'Area', 'EquivDiameter', 'Centroid');
allAreas = sort([props.Area]);
显示掩码图像。
% subplot(2,1,2);
%硬币半径,可根据参考改变
% uiwait(msgbox('选择参考点'));
% A = ginput(1);
pennyRadiusInPixels = props(3)。EquivDiameter / 2;
pennyRadiusInMm = 19.05 / 2;
%确定积分
%[x,y] = ginput(1)
%centers = [x,y];
%viscircles(centers,pennyRadiusInMm, 'Color', 'b')
将圆圈覆盖在图像上。
viscircles([props(3).Centroid(1), props(3).Centroid(2)], pennyRadiusInPixels,“颜色”“b”
返回
计算空间校准因子。
mmPerPixel = pennyRadiusInMm / pennyRadiusInPixels
Subplot (2,1,2);
标题= sprintf(“空间校准为每像素%f毫米”mmPerPixel)
标题(标题,“字形大小”字形大小,“翻译”“没有”);
绘制原始灰度图像上方覆盖层中所有斑点的边界
%使用bwboundaries()返回的坐标。
% bwboundaries()返回一个单元格数组,其中每个单元格包含图像中对象的行/列坐标。
这里是我们得到每个blob边界的地方。。
边界= bwboundaries(掩码);
% boundaries是一个单元格数组——每个blob对应一个单元格。
%在每个单元格中是一个n乘2的(行,列)格式的坐标列表。注:NOT (x,y)。
第1列是行,即y。第2列是列,即x。
numberOfBoundaries = size(边界,1);计算边界,以便在for循环中使用它
这里是我们实际绘制覆盖中每个blob边界的地方。
Subplot (2,1,1);
持有不要让边界破坏显示的图像。。
k = 1: numberOfBoundaries
thisBoundary =边界{k};获取这个特定斑点的边界。
x = thisBoundary(:,2);第2列是列,也就是x。
y = thisBoundary(:,1);第1列是行,也就是y。
情节(x, y,的r -“线宽”2);以红色表示的绘图边界。
结束
持有
标题= sprintf('包含%d个轮廓的原始图像,来自bwboundaries()', numberOfBoundaries);
标题(标题,“字形大小”、字形大小);
轴(“上”“图像”);确保图像没有人为拉伸,因为屏幕的纵横比。。
消息= sprintf(“做!\n空间校准为%f毫米每像素'mmPerPixel)
uiwait (helpdlg(消息));

答案(1)

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

登录评论。

世界杯预选赛小组名单社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!世界杯预选赛小组名单

开始狩猎!

Baidu
map