Loren在Matlab的艺术上

将想法转化为matlab

我的胡子在一周内成长多久了?

冒险的心灵弯曲的故事。一种温和令人争论的纱线。
今天的客人博客是罗茨·霍尔特,他在马萨诸塞州纳尼克的Mathworks工作。
ROB目前担任MathWorks的生物科学经理。他是生物学,生物技术和制药应用的协调员和协作者。此前,抢夺了五年作为Invicro的高级科学家,这是一家Konica Minolta公司的高级科学家,在那里他设计,实施和传达了用于药物发现和发展的图像分析算法。抢劫在达特茅斯学院赢得了博士学位,在那里他专注于通过多模式医学图像合成的分子癌成像。遵循更多robÿattics 他的推特 他的linkedin
我上周末修剪了我的胡子。虽然我的思想由于缺乏附近的计算设备而徘徊,但我认为“我的胡子头发的快速成长?”这是我无法思考的想法之一。所以我开始计划了。
我想我可以让它成为一个月的成长,然后用统治者衡量,但是我可能必须从干净的剃须身上挣扎,牺牲我保留的职业技术。
然后灵感袭来了。修剪胡子,让它成长到一周内,然后再次修剪胡子到相同的长度。如果我们有修剪毛发的照片,以及在图片中的图片中的东西,我们可以提取某种长度信息。杰出的!

阅读并显示图像

%加载图像
imname =.'mysink.jpg';
IM = imread(imname);
数字;
imshow(IM);
标题('原始图像​​');
请注意,视野中有一分钱。我扔在水槽中的原因是一分钱的直径明确定义为19.05mm。这用作已知的参考,以稍后确定像素大小。这也是我能负担得起的。

使用PENNY获得像素大小

功能 imfindcircles. 可用于在视野中找到圆形对象。请注意,我对半径范围的粗略估计,而且由于便士比背景更暗,我们将对象极性设置为黑暗。
%裁剪了关于便士的图像
PennyImage = IM(1400:1800,1000:1500,:);
%过滤一点折叠图像
PennyImagefilt = Medfilt3(PennyImage,[15 15 1]);
%使用imfindcircles功能来找到便士
拉伸= [100 300];
[中心,radii] = imfindcircles(PennyImagefilt,Radrange,......
'objectpolarity''黑暗的');
%可视化找到的所有圆圈
数字;
imshow(PennyImage)
Viscircles(中心,半径,'Edgecolor''B');
标题('用圆圈注释的便士细节');
%计算PENNY半径的像素大小
%使用mm直径/像素直径
psize = 19.05 /(半径(1)* 2);%像素大小为mm
fprintf('像素大小为%d microns \ n',圆形(psize * 1000))
像素尺寸为62微米

分割毛发

现在我们有像素尺寸,我们可以分割头发并试图找到它们的长度。为了保持更简单的事情,让我们播出一个只有头发的部分。
Justhair = IM(500:1800,1500:3000,:);
数字;
子图(121)
imshow(justhair);
标题('只是头发');
子图(122)
imshow(justhair(150:500,900:1350,:));
标题('头发上的细节');
现在我们需要从背景中分割头发。由于头发是黑暗的,背景是白色的,这相当简单。这也可以在灰度图像上完成,因为颜色并不将任何信息添加到此任务。
Grayhair = RGB2GRAY(吉斯塔希尔);
数字;
子图(121)
imshow(灰色);
标题('我的灰色头发');
子图(122)
imshow(Grayhair(150:500,900:1350))
标题(“灰色头发”细节');
希望这是未来几年我唯一的白发。
现在我们可以使用经典的OTSU阈值,它根据强度自动将图像分为两种类别。这可以使用命令完成 曲折 ,确定通过强度分隔两个类的阈值, imbinarize. ,它使用该阈值来制作二进制图像。
thresh = twaythresh(灰色);
发舵=〜Imbinarize(灰毛,阈值);
数字;
子图(121)
imshow(发型);
标题('头发细分');
子图(122)
imshow(发型(150:500,900:1350));
标题(“头发细分细节”
在这种情况下, imbinarize. 使得更明亮的部分“真”,所以 是逻辑上翻转它以制作头发部分 发桥 ,头发的分割,是 真的

尽量保持不懈的毛发

现在我们有所有的毛发。其中一些是丛生的,但大多数看起来都是独立的。对于第一次通过估计,让我们去除较大的簇,以及较小的簇,留下大多是独特的毛发。
%删除任何在边境切断的毛发
发舵= inclecleborder(bairseg);
%删除任何太小的簇
Bairseg = Bwareaopen(发型,30);
%删除过大的群集
发桥=发桥&〜bwareaopen(发尾,300);
数字;
子图(121)
imshow(发型)
标题('毛发为长度');
子图(122)
imshow(发型(150:500,900:1350)))
标题('毛发的细节为长度检查');

估计所有毛发的长度

我们现在有一个节制的最佳毛发现在进行检查。我们可以做些什么来估计它们的长度是首先骨架化(在大多数像素宽地制作每根毛发),然后在每个骨架发的头发中计算像素。这是使用属性“区域”完成的,但由于每个头发是一个像素宽,因此该区域大致等于头发的长度。
%骨展发型
Hairskel = Bwskel(Beaveg);
%显示骨骼
数字;
子图(121)
imshow(发型);
标题('头发骨架化');
子图(122)
imshow(发型(150:500,900:1350));
标题(“头发骨架化细节”);
%计算所有毛发的长度
统计= RegionProps(发型,'区域');
%从Struc中获得区域
HairlengthInpixels = Cat(1,统计数据);
%转变为现实世界长度
Hairlength = hairlengthinpixels * psize;

计算平均头发长度

所以现在我们有一个所有毛发的长度列表。因此,我们可以可视化直方图以及计算平均长度。
数字;
直方图(发型);
Xlabel('头发长度(mm)');
ylabel(“头发数量”);
meanhairlength =平均(发型);
fprintf('平均头发长度:%.1fmm \ n',意思是尺寸;
平均头发长度:2.2mm

摘要和讨论

就是这样了!我的胡子头发每周增长约2.2毫米,或每天约0.31毫米。这非常接近 吉列估计每天0.27毫米
当然,这个模型并不完美。通过将曲线拟合到每条头发,长度计算可以更准确。如果我们找到了分离更多较大的毛发的方法,分割可能更准确。但是为了大多数实际目的,这将是一个很好的估计。
这种工作流还可以应用于其他图像处理方案。例如,测量生命科学研究中的毛虫或蠕虫的长度,或测量工业制造质量控制的碎片长度。
你有没有奇怪的项目,你最近一直在进行吗?你知道你可以在这种问题上使用matlab吗?你认为我的胡子头发的高分辨率图片是不合适的吗?请在评论中分享您的想法和意见 这里
版权所有2021 Mathworks,Inc。
|

注释

要发表评论,请点击这里登录您的MathWorks帐户或创建新的。