MATLAB的博客

实用的建议在前沿的人

如何我能画一个圆吗?MATLAB冒险

今天的嘉宾是罗布·霍尔特工作MathWorks纳蒂克,马萨诸塞州。Rob目前MathWorks生物科学作为经理,他是一个协调器和合作者对生物学、生物技术和制药应用。遵循更多的罗伯的滑稽动作 他的推特 他的LinkedIn

我比我的团队的其他成员吗?

当我在我的办公室的窗户向外望去,一天,我在想我怎么可以比较我的技能我办公室的伴侣在最愚蠢的,无关紧要的时尚。我不断地精益求精(无可否认 危险的 目标)和优雅,我正在寻找一些物理的壮举,将直接的定量分析。那么它打我:画一个圆。
圆是一个完美的象征(我猜统一之类的)几个世纪以来,但是完美的圆圈仍然是一个难以达到的目标。这个圆平方,计算π,形成理想的饼干:所有明显不可能的。当然,一个可以使用指南针,但在白板呢?这无疑成为了典型的指标衡量人类技能。
但是如何量化?在本例中,我们将回顾如何段手绘形状在白板上。我们还将计算出圆。然后我们将比较的结果我的队友,看谁的圈的地位至高无上。我们将运行示例我自己的圆,然后适用于他人。

读取和显示一个图像

第一个在白板上画一个形状(或画图之类的),需要一张图片,显示了它。看到我的原始文件 Rob.jpg
%读取图像并将其显示
imname = fullfile (“图片”,“Rob.jpg”);%图像艺术家的名字命名的
[~人~]= fileparts (imname);%提取人的名字
我= imread (imname);
imshow (im)

段空白的画

这分割的任务是相对简单的,因为我们正在努力从白色背景段黑暗的形状。但由于在办公室背景照明不均匀,白板有点反光,我们一定要使用一个 自适应阈值。 也就是说,我们将使用一个不同的局部阈值在图像的不同部分独立的前景从背景和克服非均匀照明和反射的影响灯的形象。这可以通过使用 imbinarize 方法设置 “自适应” ,
%我们真的不需要颜色信息,因此让这一形象的灰色
我= rgb2gray (im);
从手机%的图片非常大,可能不同于人
%的人,让我们使图像更小,更均匀
%处理简单
我= imresize (im, 500年南);
%这imbinarize命令使用自适应阈值分割前景
%的背景
赛格= imbinarize (im,“自适应”,“ForegroundPolarity”,“黑暗”);
赛格= ~凹陷;%现在是光明的黑暗部分
% %清理细分,只保留最大的连接元素
赛格= bwareafilt(赛格,1);
imshow(凹陷)
标题(图像分割的)

了解圆的那件事

有许多不同的方法计算我在多好东西。画圆,我们要看看两种不同的方法。首先,我们计算 偏心 的形状。理想圆的离心率为零,和更高的更糟糕。
然后我们计算 循环 。理想圆的圆是1,和更低的更糟糕。
由于循环依赖于定义良好的周边,我们将关闭前形成一个凸包运行此计算。
离心率和循环可以直接使用计算 regionprops
%的凸包的形状
segfill = bwconvhull(凹陷);
%计算这种形状的面积和周长
convprops = regionprops (segfill,“偏心”,“循环”);
流(“\ tEccentricity % .3f \ n”,convprops.Eccentricity);
离心率是0.296
流(“\ tCircularity % .3f \ n”,convprops.Circularity);
循环是0.995

看到我和我的队友

现在是时候来看看我累计我的队友。我们封装调用这个处理函数 circleProcess
imdir =“图片”;%的图像存储
imnames = dir (fullfile (imdir“* * g”。));%的图像是png或jpg格式,但在g中结束的
numpeople =元素个数(imnames);
%为我们设置一些空间来存储结果
人=细胞(numpeople, 1);
ecc = 0 (numpeople, 1);
cir = 0 (numpeople, 1);
%循环的名字和得到一些信息
somecounter = 1: numpeople
%处理图像
imname = fullfile (imdir imnames (somecounter) . name);
[~人~]= fileparts (imname);
[convprops segfill, im] = circleProcess (imname);
%将结果存储
人{somecounter} =人;
法院(somecounter) = convprops.Circularity;
ecc (somecounter) = convprops.Eccentricity;
%看看分割质量控制
次要情节(numpeople 2 (somecounter-1) * 2 + 1)
imshow (im)
标题(sprintf (“% s”年代画,人)
次要情节(numpeople 2 (somecounter-1) * 2 + 2)
imshow (segfill)
标题(sprintf (“% s”年代分割,人)
结束
现在情节量化结果我们可以比较
图;
次要情节(211)
%为偏心做一个条形图
b1 = bar (ecc);
%设置x轴的人
集(gca),“xticklabel”、人、“ylim”0.7 [0])
%标签顶部的酒吧
xtips1 = b1 (1) .XEndPoints;
ytips1 = b1 (1) .YEndPoints;
labels1 =字符串(b1 (1) .YData);
文本(xtips1 ytips1 labels1,“HorizontalAlignment”,“中心”,
“VerticalAlignment”,“底”)
标题(的怪癖(更小的更好))
次要情节(212)
%为循环做同样的事情
b2 = bar (cir);
集(gca),“xticklabel”、人、“ylim”(0.8 - 1.1))
xtips2 = b2 (1) .XEndPoints;
ytips2 = b2 (1) .YEndPoints;
labels2 =字符串(b2 (1) .YData);
文本(xtips2 ytips2 labels2,“HorizontalAlignment”,“中心”,
“VerticalAlignment”,“底”)
标题(的循环(更大更好));
嗯。。。罗伯·霍尔特,看起来像在偏心我是被我们的暑期实习生鑫。没关系。我还有我的骄傲。
哦,Temo循环打我。显然打败数学,因为一个完美的圆的圆是1(这是一个文物的数字化图像,我怀疑 海岸线悖论 )。无论如何,我的圈子几乎是最圆。
所以。。。嗯。。。我。。。不再希望我做这个研究。
希望你学到了一些东西。现在在广场吗?
辅助函数
函数[convprops segfill, im] = circleProcess (imname)
%读取、灰度和resice
我= imread (imname);
我= rgb2gray (im);
我= imresize (im, 500年南);
%进行分割
赛格= imbinarize (im,“自适应”,“ForegroundPolarity”,“黑暗”);
赛格= ~凹陷;%现在黑暗中par是光明的
%区域过滤
赛格= bwareafilt(赛格,1);
%的凸包的形状
segfill = bwconvhull(凹陷);
%计算这种形状的面积和周长
convprops = regionprops (segfill,“偏心”,“循环”);
结束
|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。

Baidu
map