利用边缘灰度变化建模,来提高圆环直径求取精度
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用边缘灰度变化建模,来提高圆环直径求取精度相关的知识,希望对你有一定的参考价值。
简 介: 利用对所获得的圆环边缘亮度平均变化曲线,利用Sigmoid函数进行建模逼近,可以对原来经由HoughCircle所获得的半径进行补偿。对于利用扫描仪所获得的图片进行实际处理,可以看到它可以获得与利用轮廓面积所测量的结果精度接近的效果。但精度略差一些。
关键词
: 亮度曲线建模,Sigmoid函数,抑菌圈面积测量
§01 问题提出
1.1 背景介绍
在 抑菌圈金属模板 圆环直径提取过程中,使用HoughCircles可以比较方便求取图像中符合在一定直径范围内的圆形区域,但限于 Hough Transforms 本身的缺陷,对于圆形直径的分辨率比较低。通过 轮廓面积 来求取圆形半径,可以提升圆形直径计算精度,但是会发现这样所获取的圆形的直径受到图像在二值化过程中的阈值影响比较大。
下图显示了对于 模板在扫描以上 不同位置下(实际上是模板沿着扫描仪的对角线直线移动)所拍摄的同样模板通过轮廓反过来计算四个圆形直径对应的变化。
▲ 图1.1 利用轮廓面积获取圆形直径的数据
在博文 轮廓面积中通过手动调整阈值,可以看到所计算出来的圆形直径会产生大约1 ~ 2像素的变化。这是算法对于图像亮度所不适应性带来的影响。反过来,这种收到的影响也会受到扫描仪在不同横向和总线位置上的补光灯的亮度差也会带来对应的影响。
那么是否可以找到一种更加有效的方式,来弥补这种由于阈值(或者亮度)对于测量结果所带来的差异吗?
1.2 边缘建模
一种解决方式就是对于模板图像中圆环的边缘灰度图像进行建模,找到其中对于亮度不敏感,而是以来在于实际物体物理反射特性的参数,用于估算圆形直径。
1.2.1 分析变化变化特性
下图反映了图像中圆环边缘处的图像细节:
- 图像存在一个亮度变化过渡带;
- 像素离散化带来的马赛克效应明显;
▲ 图1.2.1 圆形边缘像素细节
变化亮度变化的过渡带表明,随着对该图像进行二值化,阈值选取不同,就会对于变化的像素在分割上出现差异,从而带来所的带到的圆形直径发生偏转。
下图给出了在圆形边缘处的灰度变化情况。
▲ 图1.2.2 圆形灰度图边缘变化
由于像素离散所带来的灰度变化的台阶,可以采用 数据插值的方式 对数据进行连续平滑处理。考虑到我们是对于圆周(半径在90, 110)所对应的大约 628个像素进行处理,所以一开始先不进行插值进行统计。
1.2.2 圆环灰度统计
具体处理方法如下:
首先根据最初通过 HoughCircles获得圆环的中心 ( x 0 , y 0 ) \\left( x_0 ,y_0 \\right) (x0,y0) 以及半径 r 0 r_0 r0 。选择合适的扫描区间: ( r 0 − Δ r , r 0 + Δ r ) \\left( r_0 - \\Delta r,r_0 + \\Delta r \\right) (r0−Δr,r0+Δr) 和扫描步数 N 0 N_0 N0 ,确定一系列的圆:
- 圆心: ( x 0 , y 0 ) \\left( x_0 ,y_0 \\right) (x0,y0)
- 第n个圆半径: r n ∈ [ r 0 − Δ r , r 0 + Δ r ] r_n \\in \\left[ r_0 - \\Delta r,r_0 + \\Delta _r \\right] rn∈[r0−Δr,r0+Δr] 。
r n = 2 ⋅ Δ r N ⋅ n + r 0 − Δ r , n ∈ 1 , 2 , ⋯ , N − 1 r_n = 2 \\cdot \\Delta _r \\over N \\cdot n + r_0 - \\Delta _r ,\\,\\,\\,n \\in \\left\\ 1,2, \\cdots ,N - 1 \\right\\ rn=N2⋅Δr⋅n+r0−Δr,n∈1,2,⋯,N−1
▲ 图1.2.3 进行圆环灰度统计
对于第
n
n
n 圆进行圆周采样,采样点
(
a
n
i
,
b
n
i
)
\\left( a_ni ,b_ni \\right)
(ani,bni) 为: 以上是关于利用边缘灰度变化建模,来提高圆环直径求取精度的主要内容,如果未能解决你的问题,请参考以下文章 利用圆圈轮廓面积求取圆环半径:cv2.findContours, contourArea
a
n
i
=
i
n
t
(
x
0
+
r
n
⋅
cos
(
θ
i
)
)
,
b
n
i
=
i
n
t
(
y
0
+
r
n
⋅
sin
(
θ
i
)
)
a_ni = \\mathop\\rm int \\left( x_0 + r_n \\cdot \\cos \\left( \\theta _i \\right) \\right),\\,\\,b_ni = \\mathop\\rm int \\left( y_0 + r_n \\cdot \\sin \\left( \\theta _i \\right) \\right)
ani=int(x0+rn⋅cos(θi)),bni=int(y0+rn⋅sin(θi