史蒂夫与MATLAB图像处理

图像处理的概念、算法和MATLAB

修改后的循环测量regionprops (R2023a)

对于一些形状,尤其是那些带有少量的像素,常用方法计算循环往往导致偏见的高值,并可以大于1。R2023a之前的版本中,函数 regionprops 使用这种常见的方法。R2023a的计算方法已被修改为正确的偏见。
完整的故事,读下去!

循环是什么?

圆的定义是:
$ c = \压裂{4π\}{p ^ 2} $
在哪里 一个 的面积形状和吗 p 是它的周长。这是一个无单位的数量,在于范围 [0,1]美元 。一个真正的圆的循环是1。这里是一些简单的估计循环测量形状。
url =“https://blogs.mathworks.com/steve/files/simple-shapes.png”;
一个= imread (url);
p = regionprops (“表”,,“循环”的“重心”])
p = 3×2表
重心 循环
1 104.0036 107.9564 0.9999
2 327.0258 141.0007 0.6223
3 619.9921 107.9377 0.1514
imshow (A)
k = 1:高(p)
文本(p.Centroid (k, 1), p.Centroid (k, 2),字符串(p.Circularity (k)),
颜色=“黄色”,
写成BackgroundColor =“蓝色”,
HorizontalAlignment =“中心”,
VerticalAlignment =“中间”,
字形大小= 14)
结束
标题(“一些简单的形状圆测量”)

循环> 1 ? ?

一些用户 可以理解困惑的发现,在以前的版本中, regionprops 有时返回值大于1的循环。例如:
url =“https://blogs.mathworks.com/steve/files/small-circle.png”;
B = imread (url);
imshow (B)
outlinePixels(大小(B))
文本(7 7“1.38”,
颜色=“黄色”,
写成BackgroundColor =“蓝色”,
HorizontalAlignment =“中心”,
VerticalAlignment =“中间”,
字形大小= 14)
标题(“循环以以前的db2版本一样”)

测量周长

在继续之前,我想停下来注意,虽然循环可以是一个有用的度量,它也可以是非常复杂的。人能迷失在分形土地当试图精确测量周长;看到伯纳德•曼德布洛特的著名论文,”英国海岸有多长?统计自相似性和分维,”维基百科上的描述 在这里 。然后,添加的困难提出的事实,我们正在与数字图像,像素的我们有时认为作为离散网格点,有时与单位面积广场。见,例如,MATLAB MVP约翰D 'Errico的回答 评论 关于这个主题。
事实上,测量周长是最常见的循环计算方法得到什么麻烦。的周长测量数字图像中的对象通常是通过跟踪从一个像素中心下,然后加起来的重量是由连续的片段之间的角度。
b = bwboundaries (b);
imshow (B)
outlinePixels(大小(B))
持有
情节(b {1} (: 1), b{1}(:, 2),颜色= (0.850 0.325 0.098),
标志=“*”)
持有
几个不同的方案已经被用来分配权重,以减少系统性偏差的周长测量。所使用的权重 regionprops 是那些在Vossepeol和Smeulders矢量概率和十进制代码错误的代表性有限长度的直线,“ 计算机图形学和图像处理 ,20卷,第364 - 347页,1982年。看到Luego的讨论,“测量边界长度,”短剑的图像分析博客:理论、方法、算法、应用程序、 https://www.crisluengo.net/archives/310/, 去年访问20 - 3月- 2023。
循环计算偏差的原因在上图中可以看到。周长是基于路径连接像素计算中心。部分的一些像素,躺在红色的曲线。正在计算周长,沿着曲线不完全包含所有正方形像素;曲线只是有点太小了。相对于面积计算,周长计算是被低估了。由于周边循环公式的分母,结果值太高了。
我们能解决这个问题通过跟踪周边路径不同?让我们尝试用数字化广场在45度角。
掩码= [
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 1 1 1 0 0 0 0 0
0 0 0 0 1 1 1 1 1 0 0 0 0
0 0 0 1 1 1 1 1 1 1 0 0 0
0 0 1 1 1 1 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 0 0 0
0 0 0 0 1 1 1 1 1 0 0 0 0
0 0 0 0 0 1 1 1 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0);
这是路径跟踪 regionprops 计算周长。
x = [1 6 11 6 1] + 1;
y = [6 1 6 11 6] + 1;
imshow(面具)
outlinePixels(大小(面具))
持有
情节(x, y,颜色= (0.850 0.325 0.098))
持有
红场的周长 4美元\ cdot 5 \√{2} \大约28.3美元 。将对应的一个领域 $(5 \√{2})^ 2美元 。然而,白色方块的数量是61。估计周长,面积不一致,这将导致一个有偏见的循环测量。
我们能解决它通过跟踪沿外周长点的像素,这样吗?
x = [1.5 6.5 7.5 12.5 - 12.5 7.5 - 6.5 1.5 - 1.5);
y = [6.5 1.5 1.5 6.5 - 7.5 12.5 - 12.5 7.5 - 6.5);
imshow(面具)
outlinePixels(大小(面具))
持有
情节(x, y,颜色= (0.850 0.325 0.098))
持有
现在,计算周长是太高,因为它对应于一个区域,远远大于61年,白色像素的数量。
perim =总和(√总和(diff ((x (:) y (:))) ^ 2, 2)))
perim = 32.2843
的广场,周边对应于这个区域:
面积= (perim / 4) ^ 2
面积= 65.1421
这一次,估计周边过高的估计区域,所以计算循环将偏向低。
如果我们计算周长沿着边缘像素通过跟踪?
x = [1.5 2.5 2.5 3.5 3.5 4.5 4.5 5.5 5.5 6.5 6.5
7.5 7.5 8.5 8.5 9.5 9.5 10.5 10.5 11.5 11.5 12.5 12.5
11.5 11.5 10.5 10.5 9.5 9.5 8.5 8.5 7.5 7.5 6.5 6.5
5.5 5.5 4.5 4.5 3.5 3.5 2.5 2.5 1.5 1.5);
y = [7.5 7.5 8.5 8.5 9.5 9.5 10.5 10.5 11.5 11.5
12.5 12.5 11.5 11.5 10.5 10.5 9.5 9.5 8.5 8.5
7.5 7.5 6.5 6.5 5.5 5.5 4.5 4.5 3.5 3.5 2.5 2.5 1.5 1.5
2.5 2.5 3.5 3.5 4.5 4.5 - 5.5 5.5 - 6.5 6.5 - 7.5);
imshow(面具)
outlinePixels(大小(面具))
持有
情节(x, y,颜色=(0.850 0.325 0.098),线宽= 5)
持有
但是现在计算周长 的方式 过高的地区,因此计算循环会非常低。
perim =总和(√总和(diff ((x (:) y (:))) ^ 2, 2)))
perim = 44

偏差修正模型

毕竟,我们决定离开周长跟踪方法。相反,我们提出了一个简单的近似模型的循环性偏差,然后使用模型来得出一个校正因子。
考虑一个圆半径 r 。我们可以通过计算模型偏差循环使用面积计算 r 和周长的计算 美元$ r - 1/2 。结果, c '美元 是有偏见的循环模型。
$ c ' = \压裂{1}{1 - \压裂{1}{r} + \压裂{0.25}{r ^ 2}} = \压裂{1}{\离开(1 - \压裂{0.5}{r} \右)^ 2}$
情况如何 c '美元 符合老 regionprops 计算返回吗?这是一个比较进行数字化圆圈的半径范围。
bias-model-comparison-for-circles.png
但是对于一般的形状,我们应该做什么?毕竟,如果我们已经知道它是一个圆,然后没有大需要计算循环指标,对吧?
这是策略:考虑到计算区域, 一个 确定一个 等效半径 , 美元$ r_{\文本{eq}} ,这是一个圆的半径相同的区域。然后,用 美元$ r_{\文本{eq}} 获得一个偏差校正因子:
美元c_{\文本{纠正}}= c \离开(1 - \压裂{0.5}{r_{\文本{eq}}} \右)^ 2 = c \离开(1 - \压裂{0.5}{\ sqrt{/ \π}}\右)^ 2美元

它工作吗?

我们只是做了一个大假设,计算 美元$ r_{\文本{eq}} 好像我们的形状是一个圆。我们真的能做到吗?我们做了一系列的实验,使用各种各样的形状,在大范围的大小缩放,旋转不同角度。这是一个实验的结果,用一个等边三角形基地旋转20度的水平轴。蓝色曲线是以前版本的循环计算;红色曲线是纠正循环作为R2023a计算,和横向橙色线的理论价值。
equilateral-triangle-20-degrees.png
我们看到类似的曲线广泛的形状。对于一些形状,理论循环价值低于0.2,校正不完善的结果。然而,总的来说,我们认为是值得的,的校正方法 regionprops 应该将它改变。
如果你需要以前计算的价值在你的代码中,看到的版本历史部分 regionprops参考页面 的指令。

Helper函数

函数outlinePixels(深圳)
M =深圳(1);
N =深圳(2);
k = 1.5: (n - 0.5)
参照线(k,颜色= [。7 7 7]);
结束
k = 1.5: (m - 0.5)
yline (k,颜色= [。7 7 7]);
结束
结束
|
  • 打印
  • 发送电子邮件

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。