OpenCV(C++) 基础(四)-- 边缘检测与霍夫变换

1. 边缘检测

Sobel():灵活调整水平或者垂直边缘检测,基于高斯平滑和微分求导

void Sobel(src, dst, depth, dx, dy, ksize=3);
// depth: 对应图像类型
// dx, dy: x,y方向的差分阶数,控制在x,y轴上的边缘检测程度
// case:
Sobel(src, dst, CV_16S, 0, 1, 3);

Canny(): 低错误率+高定位性+最小响应

void Canny(src, dst, threshold_1, threshold_2, apertureSize=3);
// threshold_1, threshold_2: 较大的值用于控制强边缘连接,较小的值用与控制弱边缘连接
// apertureSize: Sobel算子的孔径大小
// case:
Canny(src, edge, 3, 9, 3);

Laplacian():原图减去其Laplacian算子可以增强对比度

void Laplacian(src, dst, depth, ksize=1, double scale=1, 
               double delta=0, borderType=BORDER_DEFAULT);
// scale: 缩放因子
// case: 后面三个参数为默认参数
Laplacian(src, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT);

scharr滤波器:

void Scharr(src, dst, depth, dx, dy, scale=1, delta=1, borderType=BORDER_DEFAULT);
// case:
Scharr(src, dst, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT);

2.霍夫变换

用于检测直线 / 曲线 / 圆

标准霍夫变换(检测直线) HoughLines():

void HoughLines(src, dst, double rho, double theta, threshold, double srn=0, double stn=0);
// rho: 直线搜索尺寸的单位半径
// theta: 角度精度,以弧度为单位
// thresold: 判定为直线所需的累加直线值
// srn / stn: 默认为0,适用于多尺度霍夫变换
// case: 绘制直线
vector<Vec2f>lines;
HoughLines(src, dst, 1, CV_PI/180, 150, 0, 0);
for(size_t i=0; i<lines.size(); i++){
    float rho = lines[i][0], theta = lines[i][1];
    Point pt1, pt2;
    double a = cos(theta), b = sin(theta);
    double x0 = a*rho, y0 = b*rho;
    pt1.x = cvRound(x0 + 1000*(-b));
    pt1.y = cvRound(y0 + 1000*a);
    pt2.x = cvRound(x0 - 1000*(-b));
    pt2.y = cvRound(y0 - 1000*a);
    line(dst, pt1, pt2, Scalar(255,255, 0), 1, LINE_AA);
}

累计概率霍夫变换 HoughLinesP():

void HoughLinesP(src, dst, rho, theta, threshold, minLineLength=0, maxLineGap=0);
// minLineLength: 最短线段长度
// maxLineGap: 线段最短断裂距离
// case:
HoughLinesP(src, dst, 1, CV_PI/180, 80, 50, 10);

霍夫圆变换 HoughCircles():检测灰度图中的圆

void HoughCircles(src, dst, method, dp, minDist, 
                  param1=100, param2=100, minRadius=0, maxRadius=0);
// method: 检测方法,目前可用 HOUGH_GRADIENT
// dp: 用于检测圆心的累加器图像的分辨率与输入图像之比的倒数,
// dp=1则分辨率相同,dp=2则累加器有输入图像的一半的宽高
// param1:method的对应参数,传递给Canny算子的高低阈值
// param2: method的对应参数,越大则检测的圆更接近完美,否则检测出越多不完美的圆
// minRadius / maxRadius: 检测出的圆半径的最大最小值
// case:
HoughCircles(src, dst, HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);

猜你喜欢

转载自blog.csdn.net/francislucien2017/article/details/82823769