1.霍夫变换——直线

(1)霍夫直线变换介绍

Hough      Line           Transform用来作直线检测

前提条件——边缘检测已经完成

平面空间到极坐标空间转换

对于任意一条直线上的所有点来说,变换到极坐标中,从[0~360]空间,可以得到r的大小

属于同一条直线上点在极坐标空(r,theta)必然在一个点上有最强的信号出现,根据此反算到平面坐标中就可以得到直线上各点的像素坐标。从而得到直线

(2)相关API

标准的霍夫变换cv::HoughLines从平面坐标转换到霍夫空间,最终输出是(θ,rθ)表示极坐标空间

霍夫变换直线概率cv::HoughLinesP最终输出是直线的俩个点(X0,Y0,X1,Y1)

CV::HoughLines(inputArray           src,//输入图像,必须为8-bit的灰度图像

                              outputArray     lines,//输出的极坐标来表示直线

                              double             rho,//生成极坐标时候的像素扫描步长

                             double              theta,//生成极坐标时候的角度步长,一般取值CV_P1/180

                             int                     threshold,//阈值,只有获得足够交点的极坐标点才被看成是直线

                            double               srn=0;//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换

                            double               stn=0;//是否应用多尺度的霍夫变换,如果不是设置为0表示经典霍夫变换

                            double               min_theta=0;//表示角度扫描范围0~180之间,默认即可

                           double                max_theta=CV_PI)//一般情况是有经验的开发者使用,需要自己反变换到平面空间

cv::HoughLinesP(inputArray                   src,//输入图像,必须为8-bit的灰度图像

                               outputArray     lines,//输出的极坐标来表示直线

                              double              rho,//生成极坐标时候的像素扫描步长

                              double              theta,//生成极坐标时候的角度步长,一般取值CV_P1/180

                              int                     threshold,//阈值,只有获得足够交点的极坐标点才被看成是直线

                             double               min_theta=0;//表示角度扫描范围0~180之间,默认即可

                            double                max_theta=CV_PI)//

 

 

2.霍夫变换——圆

(1)霍夫圆检测原理

从平面坐标到极坐标转换三个参数C(X0,Y0,R)其中x0,y0是圆心

假设平面坐标的任意一个圆上的点,转换到极坐标中:C(X0,Y0,R)处有最大值,霍夫变换正是利用这个原理实现圆的检测

(2)相关API(cv::HoughCricles)

因为霍夫圆检测对噪声比较敏感,所以首先要对图像做中值滤波,基于效率考虑,opencv中实现的霍夫变换圆检测是基于图像梯度的实现,分为俩步:

  1. 检测边缘,发现可能的圆心
  2. 基于第一步的基础上从候选圆心开始计算最佳半径大小

HoughCircles(inputArray                   image,//输入图像,必须是8位的单通道灰度图像

                      Outputarray     image,//输出结果,发现的圆信息

                       Int                   method,//方法-HOUGH_GRADIENT

                       Double            dp,//dp=1;

                       Double            mindist,//10最短距离-可以分辨是俩个圆的,否则认为是同心圆

                       Double             param1,//canny edge detection low threshold

                       Double             param2,//中心点累加器阈值-候选圆心

                       Int                     minradius,//最小半径

                       Int                     maxradius,//最大半径)

3.像素重映射

(1)什么是像素重映射

简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像

G(x,y)=f(h(x,y));g(x,y)是重映射之后的图像h(x,y)是功能函数f是原图像

(2)API介绍(cv::remap)

Remap(inputarray            src,//输入图像

           Outputarray           dst,//输出图像

           Inputarray              map1,//x映射表cv_32fc1/cv_32fc2

           Inputarray              map2,//y映射表

           Int                           interpolation,//选择的插值方法,常见线性插值,可选择立方等

           Int                           borderMode,//BORDER_CONSTANT

           Const                      Scalar       borderValue//color)

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐