从高度模糊的图片中识别同心圆

220 views
Skip to first unread message

崔灏 (CUI Hao)

unread,
Nov 10, 2015, 3:02:11 AM11/10/15
to LUG 邮件列表
四级大雾实验找了个写程序的课题。大概是这样:

同学们在实验中会用手机拍摄一些照片[1],实际的图像是若干同心圆。最后要
得到这些同心圆的(相对)半径。现在希望写一个程序自动化统计半径的过程。

我本来提出的一个简易的方法是:
1、找一条相对靠近图像中心的直线,得到在这条直线上的一维亮度分布曲线;
2、对曲线进行适当的滤波和平滑操作,取出若干个峰(对应与圆的交点);
3、找到这些峰的对称中心;
4、过这个对称中心作前面的直线的垂线,再来一次前述操作得到这个垂线上
亮度峰分布的对称中心,这应该就是圆心;
(为了减小误差,可以多取几个方向找圆心,再做平均)
5、找到圆心后,剩下的就好办了,统计各半径下的亮度分布就知道圆半径了。

然而老师觉得这个方法太 low,希望通过霍夫变换之类的方法找圆(还并不知
道这个方法具体是什么)。但这样貌似对图像预处理要求很高,必须过滤出比
较清晰的图形边界才行。

没有学过计算机图形学,对图像预处理一窍不通。希望大家帮忙看看,提出一
下自己的思路(要进行哪些操作,用到什么算法)~

[1] 照片例子: http://home.ustc.edu.cn/~cvhc/phy4/

--
崔灏 / CUI Hao
Homepage: i-yu.me
Twitter: @cuihaoleo

Justin Wong

unread,
Nov 10, 2015, 3:14:15 AM11/10/15
to ustc...@googlegroups.com
我倒是想到先找到圆心,画一条「最大半径」绕一圈亮度做一个亮度积分。
然后用EM算法求解混合高斯模型……

--
Justin Wong
> --
> -- 来自USTC LUG
> 请使用gmail订阅,不要灌水。
> 更多信息more info:http://groups.google.com/group/ustc_lug?hl=en?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "USTC_LUG" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to ustc_lug+u...@googlegroups.com.
> To post to this group, send email to ustc...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

Bojie Li

unread,
Nov 10, 2015, 5:59:41 AM11/10/15
to USTC_LUG

计算机图形学挂科的答一发:

https://en.wikipedia.org/wiki/Circle_Hough_Transform

Wiki 页面最下面是 OpenCV 的样例代码。

在霍夫变换之前,可以尝试做一下平滑处理以减少噪声,上述代码里的 blur 就是做这个的。并不需要进行边界检测。


张光宇

unread,
Nov 10, 2015, 6:25:49 AM11/10/15
to ustc...@googlegroups.com
可是这个图边界不明显,houghcircle会找不到的

崔灏 (CUI Hao)

unread,
Nov 10, 2015, 7:17:49 AM11/10/15
to LUG 邮件列表
我有测试 OpenCV 的 Hough
变换探测圆的示例程序,效果很是不理想。不做预处理是根本不行的,一大坨误判。简单的预处理(按亮度二值化)误判仍然比较严重。而且看起来这个算法也挺耗时的。大概正如维基百科上所说,这个算法面对噪音不太鲁棒。

觉得还是先我那个按亮度分布找圆心的比较方便,先用 python 写一个出来吧。

问了些人,大致也就这两种思路了。预处理+识别圆形虽然逼格高一点,不过复杂度很高也不见得效果好。



2015-11-10 20:25 GMT+09:00 张光宇 <zguan...@gmail.com>:
> 可是这个图边界不明显,houghcircle会找不到的

Jerome Jin

unread,
Nov 10, 2015, 7:23:18 AM11/10/15
to ustc...@googlegroups.com
原图-二值化-开闭运算(去噪声)-边缘检测(比如canny算法)-houghcircle找圆

2015-11-10 19:25 GMT+08:00 张光宇 <zguan...@gmail.com>:
可是这个图边界不明显,houghcircle会找不到的

Yan Wang

unread,
Nov 11, 2015, 11:40:11 PM11/11/15
to ustc...@googlegroups.com
Inline image 1
Inline image 2

预处理了一下,现在感觉比以前要容易处理一些。这个图不是太适合Hough Transform的原因是,他有很多圆,彼此干扰。解决也不复杂,先做连通片搜索,把图片分成一个一个圆环,然后再Hough Transform。

​还有这不是计算机图形学的范畴,这是计算机视觉。​

Yan Wang

unread,
Nov 11, 2015, 11:41:48 PM11/11/15
to ustc...@googlegroups.com

基本上是Jerome Jin的思路。

Chengze Li

unread,
Nov 12, 2015, 12:21:18 AM11/12/15
to ustc...@googlegroups.com
我的建议是找contour和contour的凸包。
因为在这里几乎可以认定每个“好的”contour的凸包都是一个正圆,所以可以假定

S(c_i)+S(c_i_inside) = S(convexHull(c_i))
其中S表示面积,c_i即第i个contour,convexHull即最小凸包。

如果不满足该式,要么是contour并不是一个圆环,要么contour可能是噪声。

当然在寻找凸包之前做一次腐蚀(想办法联通不连通区域)可能会更好一点。

之后就可以找圆心,然后随便找个方向射线就可以了,也可以按照Yan Wang的说法:
把图片分成一个一个圆环,然后再Hough Transform。
由于之前的contour search已经找到这样的联通片了,只要分开每一个圆环就可以了。而这些都可以通过OpenCV来实现。 
即颂文绥

@ljsabc
"life,love,linux"

Wung Hugh

unread,
Nov 12, 2015, 10:26:58 PM11/12/15
to USTC_LUG
我觉得hough没用同心这个条件。不妨做个sobel,这时所有矢量都应指向圆心。可用相交/环积分来找圆心。完了再用环积分找半径们即可
我下了课回去写一个试试。

Wung Hugh

unread,
Nov 12, 2015, 10:27:06 PM11/12/15
to USTC_LUG

Wung Hugh

unread,
Nov 12, 2015, 10:27:10 PM11/12/15
to USTC_LUG

Wung Hugh

unread,
Nov 12, 2015, 10:27:10 PM11/12/15
to USTC_LUG

Wung Hugh

unread,
Nov 12, 2015, 10:28:18 PM11/12/15
to USTC_LUG

Wung Hugh

unread,
Nov 12, 2015, 10:28:22 PM11/12/15
to USTC_LUG

Wung Hugh

unread,
Nov 12, 2015, 10:28:22 PM11/12/15
to USTC_LUG

Wung Hugh

unread,
Nov 12, 2015, 10:28:23 PM11/12/15
to USTC_LUG

Wung Hugh

unread,
Nov 12, 2015, 10:28:24 PM11/12/15
to USTC_LUG

Wung Hugh

unread,
Nov 12, 2015, 10:28:27 PM11/12/15
to USTC_LUG

Wung Hugh

unread,
Nov 12, 2015, 10:46:12 PM11/12/15
to USTC_LUG
抱歉,网速太差了。。。

Yan Wang

unread,
Nov 12, 2015, 11:25:54 PM11/12/15
to ustc...@googlegroups.com
我试了一下连通片分割和Hough Transform,效果的确不好。。结果如图。。感觉可能要用RANSAC之类的算法才能搞定。。

可能相关的文档:

我的结果:
Inline image 6Inline image 1Inline image 5Inline image 4Inline image 3Inline image 2


On Thu, Nov 12, 2015 at 7:46 PM, Wung Hugh <hugh...@gmail.com> wrote:
抱歉,网速太差了。。。

Yan Wang

unread,
Nov 13, 2015, 12:40:11 AM11/13/15
to ustc...@googlegroups.com
好了,RANSAC可解,结果如图。师兄只能帮你到这了。。
Inline image 1

Wung Hugh

unread,
Nov 13, 2015, 5:50:33 AM11/13/15
to USTC_LUG
代码?

Wung Hugh

unread,
Nov 14, 2015, 7:37:21 AM11/14/15
to USTC_LUG
https://git.ustclug.org/aaronwang/concentercircle
my code.
我只找了圆心,还凑合。

Wung Hugh

unread,
Nov 14, 2015, 8:35:35 AM11/14/15
to ustc...@googlegroups.com

images

IMG_20151013_155336WithCenter.jpg
IMG_0090WithCenter.jpg
IMG_0095WithCenter.jpg
Reply all
Reply to author
Forward
0 new messages