作为全球某机器视觉头部大厂的资深工程师,深感学校和互联网上主要资料局限于计算机视觉领域,能落地工业领域的算法寥寥无几,且相关算法原理语焉不详、乏善可陈,或示例代码缺少关键实现、谬误百出, 故作【庖丁解牛】系列课程,掰开揉碎了讲解机器视觉领域核心算法,并提供完整的高质量代码,力争为从业者提供严格贴近工业应用场景的、高质量的国际一线算法剖析。
本系列课程围绕工业视觉算法原理及实现,具体场景落地应考虑的工程实践化设计要点及经验,笔者将在其他系列课程中讲解。
庖丁解牛本期公开课的主题是 圆环展开。
术语解释
顾名思义,圆环展开是将指定圆环展开为矩形。
几何基础
如图1所示,圆环内径为r,外径为R,圆心为O。
设圆心O坐标为 ( x 0 , y 0 ) (x0,y0) (x0,y0),射线PO到射线OC1的夹角为θ,由几何知识可知:
内圆上点P的坐标 ( x , y ) (x,y) (x,y)为:
x = x 0 + r ∗ c o s θ y = y 0 − r ∗ s i n θ x = x0 + r * cosθ\\ y = y0 - r * sinθ x=x0+r∗cosθy=y0−r∗sinθ
外圆上点P’的坐标 ( x ′ , y ′ ) (x',y') (x′,y′)为:
x ′ = x 0 + R ∗ c o s θ y ′ = y 0 − R ∗ s i n θ x' = x0 + R * cosθ\\ y' = y0 - R * sinθ x′=x0+R∗cosθy′=y0−R∗sinθ
同理可知,若点P落在以O为圆心,半径为Radius(r≤Radius≤R)的圆周上,则其坐标 ( X , Y ) (X,Y) (X,Y)为:
X = x 0 + R a d i u s ∗ c o s θ Y = y 0 − R a d i u s ∗ s i n θ X = x0 + Radius * cosθ\\ Y = y0 - Radius * sinθ X=x0+Radius∗cosθY=y0−Radius∗sinθ
原理推导
首先要确定展开矩形图像的宽和高。在此,我们不假思索地给出以下结论:
D s t W i d t h = ( r + R ) ∗ 2 π ∗ 0.5 D s t H e i g h t = R − r \begin{align*} & DstWidth = (r + R) * 2π * 0.5 & \\ & DstHeight = R - r & \end{align*} DstWidth=(r+R)∗2π∗0.5DstHeight=R−r
然后,要确定展开矩形图像中,第i行第j列像素点的灰度值。
假设图1中,点C1到G1连线方向为圆环展开的起始方向,由【原理推导】小节结论可知,展开矩形图像中,第i行第j列像素点对应原图像中的坐标为:
x = x 0 + ( r + i ) ∗ c o s ( j ∗ 2 π / D s t W i d t h ) y = y 0 − ( r + i ) ∗ s i n (