本文源于我一个多月前的一个知乎回答,原本当时就想发到专栏里归一下档,谁知在忙碌和拖延症的双重影响下一直没做这件事。至于为什么现在突然发出来,因为最近我想到一个新的好点子,可以写一个简单而有趣的开源项目,然而近期估计不能马上做完,就在专栏更个老文章先过过瘾吧……(逃

就在一个多月前,苹果在WWDC2019上发布了新款Mac Pro,其新奇大胆的设计理念震惊了整个科技圈:

不,图片故意放错了,是下面这张:

于是在当时十分热烈的讨论中,有题主问出了如何用Python统计新Mac Pro圆圈个数的问题。我不是CV方向的老手,就简单试验了一个基于规则的方法。本质上是用霍夫变换实现圆形目标的识别,而且也能用python3和opencv-python库很轻松地实现。先上结果:计数时顺便用MatplotLib库将识别到的所有圆圈标出

下文将详细总结一下方法的原理及实现步骤。

一、霍夫变换的原理

霍夫变换的原理并不复杂,下面以检测直线为例来简单介绍下(如果不感兴趣可以直接跳过):

上图有5个排列没啥规律的点,如果我们把它当成现实生活中图片的极简化情况(假设这5个点是黑色像素点),如果要从图片中识别一条最有可能的直线

,要怎么找呢?一种很自然的思路是看哪一条直线经过了最多的黑色像素点。

霍夫变换的思想是将直线

变换为

的形式,

分别变成自变量和因变量,而

反而成了参数。我们把

展成的二维空间称为参数空间。根据霍夫变换的性质,一个在原空间的点

在参数空间中,作为参数描述了一条直线:参数空间中A(1, 0.5)的图像

下面我们将原图片中5个点分别变换到参数空间,可得下图:

可以看到,5条直线除了C和D平行以外,其他两两相交(有些交点因为太远在上图无法看到),且A、B、C三条直线交于一点。这个交点代表什么呢?代表了存在相同的参数

,也就是在原空间中A、B、C三点共线!求出交点坐标,也得到了那条直线的方程。

因此,霍夫变换将复杂的多点共线问题转化为简单的多线共点问题,我们只需求出参数空间中有最多条直线穿过的那个交点,就能识别原图中最明显的那条直线。而原空间中斜率不存在的情况(参数空间中直线平行)可以通过转换为极坐标解决。

霍夫变换识别圆同理,但变复杂了一些。我们都知道圆的方程

有三个参数,如果

确定,参数空间是二维,原空间的点在参数空间会对应一个圆

;当

不确定时,参数空间变成三维,原空间的点则会变成一个个圆锥

二、OpenCV的相关算法和API

OpenCV对该算法进行了优化,称为霍夫梯度法,可以分为估计

和估计

两个步骤

估计

(圆心):用Canny算法进行边缘检测,得到边界二值图;

用Sobel算子计算原图的梯度;

遍历边缘二值图中的非0点,沿着梯度方向和反方向画线段(梯度方向为圆弧的法线方向,即半径方向),线段的起点和长度由参数允许的半径区间决定。将线段经过的点在累加器中记数;

对累加器中的点从大到小排序,记数越大越有可能成为圆心,优先估计半径。

估计

(半径):计算所有边界图中的非0点离圆心的距离,并从小到大排序;

从最小半径

开始,距离相差在一个小量范围内的点,都认为是同一个圆,记数属于该半径

的非0点数,记为

尝试放大半径,同样记数该半径上的点数;

判断两个半径孰优孰劣的依据——点的线密度(

),密度越高,半径的可信度越大;

重复以上步骤,直至半径超过参数允许的范围,从而得到最优半径。

说到这里,opencv-python库的相关API就好懂多了:

cv2.HoughCircles(

image,

method,

dp,

minDist,

circles=None,

param1=None,

param2=None,

minRadius=None,

maxRadius=None

)

重要参数说明:image:8位单通道图像(不能是彩色图像)。

method:检测方法,这里只能是cv2.HOUGH_GRADIENT。

dp:用来检测圆心的累加器图像的分辨率与输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。如果dp=1,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半的宽度和高度。

min_dist:霍夫变换检测到的圆的圆心之间的最小距离,即算法能明显区分的两个不同圆之间的最小距离。

param1:Canny算法的高阈值,低阈值设为其的一半。

param2:累加器的阈值,它越小的话,就可以检测到更多残缺的圆,而它越大的话,能通过检测的圆就更加接近完整的圆。

minRadius和maxRadius:给定半径的上下界。

三、具体实现

既然是基于规则的方法,我们需要人工定义各个参数。首先我们找到一张Mac Pro的正面图片,粗略估计下图片中每个圆圈的半径范围:

根据测量结果(45px左右),可以把半径范围设为20到25px之间。半径范围严格一点,就能规避更多我们不需要的圆。

经过一番试验,我们可以调出所有参数。用到OpenCV的代码节选如下:

img = cv2.imread('mp.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图像

circle1 = cv2.HoughCircles(

gray,

cv2.HOUGH_GRADIENT,

1,

5,

param1=100,

param2=30,

minRadius=20,

maxRadius=25

)

circles = np.uint16(np.around(circle1[0, :, :])) # 提取为二维并四舍五入

circle_count = 0

for i in circles[:]:

circle_count += 1

答案是158,这毕竟是花了30分钟写出来的代码跑的珍贵成果。花30秒肉眼数一下,没错!(但好像有哪里不对)

PS:有人曾问过我“内层黑色的圆”怎么计数的问题,这个虽然可以继续调参数实现,但只要认真观察一下,就会发现新Mac Pro的设计没有“内层”的概念,自然也没有“黑色的圆”。油管上有大神用自己的机床车了一个通风口的模型出来(其实他是用来试验拿这个当刨丝器好不好用23333),可以很清楚的看到通风口的细节:

本篇文章的完整版代码我放进了GitHub,欢迎参考。zamhown/my-zhihu​github.com

参考

哪款mac写python_新款Mac Pro有几个圈圈?写几行Python数一下相关推荐

  1. 数位屏不知道买哪款?绘王新款Kamvas Pro 13数位屏开箱

    Kamvas Pro 13是2018年7月份绘王在国外新上市的新款数位屏,也是目前绘王所有数位屏中最小的一款.而官方宣称该款数位屏采用绘王最新的无源技术.倾斜功能.8192级的压感技术.266PPS的 ...

  2. linux系统启动设置mac,Apple表示新款Mac将阻止Linux启动

    导读 苹果的新一代Mac配备了新的所谓Apple T2安全芯片,该芯片应该提供一个Secure Enclave协同处理器,负责为包括Touch ID在内的安全功能提供支持. 与此同时,这款安全芯片支持 ...

  3. python pdf编辑开发_20行Python代码实现一款永久免费PDF编辑工具的实现

    PDF(Portable Document Format),中文名称便携文档格式是我们经常会接触到的一种文件格式,文献.文档...很多都是PDF格式.它以格式稳定的优势,使得我们在打印.分享.传输过程 ...

  4. 腾讯云推出首款自研服务器星星海;苹果新款Mac Pro整套配齐超30万;Fedora 31稳定版发布|极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  5. 10月30日科技资讯|腾讯云推出首款自研服务器星星海;苹果新款Mac Pro整套配齐超30万;Fedora 31稳定版发布|极客头条

    「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 整理 | 郭 ...

  6. Facebook 约十亿美元收购脑机技术公司,助攻AR研发;苹果宣布新款 Mac Pro 在美国生产;谷歌称已实现量子霸权…...

    关注并标星星CSDN云计算 极客头条:速递.最新.绝对有料.这里有企业新动.这里有业界要闻,打起十二分精神,紧跟fashion你可以的! 每周三次,打卡即read 更快.更全了解泛云圈精彩news g ...

  7. 苹果新款笔记本_苹果自研CPU最快下月杀到 搭配史上最便宜Mac笔记本(全文)_苹果 新款MacBook Pro 13英寸_笔记本新闻...

    此前苹果决定自研ARM架构的处理器引发了业界不小的关注,没想到苹果动作神速,苹果自研CPU最快下月杀到,并且搭配在史上最便宜Mac笔记本上,定价或在799美元.根据最新的报料称,可能最快11月17日就 ...

  8. Apple 计划在 2022 年推出五款新 Mac,包括入门级 MacBook Pro Refresh

    据有关消息报道,苹果正在开发五款新 Mac,将于 2022 年推出,其中包括新版本的入门级 MacBook Pro. 在最新一期的"开机"通讯中,古尔曼表示,他预计苹果将在 202 ...

  9. 苹果发布新款iPad Pro, MacBook Air 和 Mac Mini

    中文翻译系博主自己翻译,转载请注明出处 Apple unveils new iPad Pro, MacBook Air and Mac Mini 苹果发布新款iPad Pro, MacBook Air ...

最新文章

  1. java继承 映射_hibernate继承关系映射和java反射机制的运用
  2. option:contains后面加变量_Python基础篇 -2:初识Python中的变量
  3. python代码翻译-Python编程学习 -- 用十几行代码实现一个翻译器
  4. mapreduce编程实例python-Python编写MapReduce作业的简单示例
  5. java weblogic admin,weblogic admin 不能重起服务(Server may already be running)
  6. docker容器启动几分钟之后自动退出
  7. SparkStreaming优化
  8. 快速无需脚本直接用迅雷下载页面全部链接
  9. 浅谈被动式IAST产品与技术实现
  10. Word:快速插入水平分隔线(转)
  11. PMI采购MogaFX经理人指数是什么
  12. 使用CSS实现图片叠加效果
  13. 记一次在学院服务器装Ubuntu系统
  14. 修身修心的1000+篇文章总结
  15. GNU:gcc -v
  16. 指针、函数、指针函数和函数指针
  17. 多态的摸索之路( 甲 )
  18. 腾讯云IDC产品家族重装亮相 加速布局新基建
  19. 微信小程序 三 圆形图片
  20. w10谷歌chrome关闭自动更新

热门文章

  1. dz.27z.co index.php,【DZ插件】VIP客户组开通 v2.0.2(zms)
  2. Okhttp源码分析以及Google Gson解析json数据实例
  3. 使用Spring Data访问MongoDB数据库
  4. lombok常用注解
  5. 三阶段面试题——vue
  6. android手机配什么蓝牙耳机,Airpods Pro搭配安卓手机+Windows电脑服用指南(避坑指南)...
  7. Scrum之团队绩效评估
  8. 商业模式与盈利模式的区别
  9. 【沙发管家】华为悦盒刷机破解详细攻略,附多个第三方精简固件
  10. python自动化看什么书_python自动化测试书籍