美文网首页
霍夫变换

霍夫变换

作者: samychen | 来源:发表于2018-02-24 14:28 被阅读0次

霍夫变换——直线

  Hough Line Transform用来做直线检测,前提是已经做了边缘检测。
  霍夫变换是平面空间到极坐标空间的转换,具有以下特点:

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

相关API:

  • 标准的霍夫变换cv::HoughLines从平面坐标转换到霍夫空间,最终输出是(theta,r),表示极坐标空间
  • 霍夫变换直线概率cv::HoughLinesP最终输出是直线的两个点

先进行边缘检测,在进行霍夫直线检测

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, int ** argv)
{
    src = imread("F:/linedec.png");
    if (!src.data) {
        printf("无法加载图片\n");
        return -1;
    }
    namedWindow("input img", CV_WINDOW_AUTOSIZE);
    namedWindow("output img", CV_WINDOW_AUTOSIZE);
    Canny(src, gray, 150, 200);
    cvtColor(gray, dst, CV_GRAY2BGR);
    imshow("edge img", gray);
    vector<Vec4f> plines;
    HoughLinesP(gray, plines, 1, CV_PI / 180.0, 10, 0, 10);
    Scalar color = Scalar(0, 0, 255);
    for (size_t i = 0; i < plines.size(); i++)
    {
        Vec4f hlines = plines[i];
        line(dst, Point(hlines[0], hlines[1]), Point(hlines[2], hlines[3]), color, 3, LINE_AA);
    }
    imshow("output img", dst);
    waitKey(0);
    return 0;
}

演示效果


image.png

霍夫变换——圆检测

  从平面坐标到极坐标转换三个参数C(x0,y0,r)其中x0与y0是圆心坐标
  假设平面坐标的任意一个圆上的点,转换到极坐标中:C(x0,y0,r)处有最大值,霍夫变换正是利用这个原理实现圆的检测。

相关API:
cv::HoughCircles
  因为霍夫圆检测对噪声比较敏感,所有先对图像做中值滤波。
  基于效率考虑,opencv中实现的霍夫变换圆检测是基于图像梯度的实现,分为两步:

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

HoughCircles参数说明

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, int ** argv)
{
    src = imread("F:/circle.png");
    if (!src.data) {
        printf("无法加载图片\n");
        return -1;
    }
    namedWindow("input img", CV_WINDOW_AUTOSIZE);
    namedWindow("output img", CV_WINDOW_AUTOSIZE);
    imshow("input img", src);
    //中值滤波
    Mat output;
    medianBlur(src, output, 3);
    cvtColor(output, output, CV_BGR2GRAY);
    //霍夫圆检测
    vector<Vec3f> pcircles;
    HoughCircles(output, pcircles, CV_HOUGH_GRADIENT, 1, 10, 100, 30, 5, 50);
    src.copyTo(dst);
    for (size_t i = 0; i < pcircles.size(); i++)
    {
        Vec3f cc = pcircles[i];
        circle(dst, Point(cc[0], cc[1]), cc[2], Scalar(0, 0, 255), 2, LINE_AA);
        circle(dst, Point(cc[0], cc[1]), 2, Scalar(0, 255, 0), 2, LINE_AA);
    }
    imshow("output img", dst);
    waitKey(0);
    return 0;
}

演示效果


image.png

cc[0]cc[1]代表圆心的x和y的像素值,cc[2]代表半径

相关文章

  • 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,

    【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑文辑: https://blog.c...

  • OpenCV-Python学习(十六):霍夫变换

    目录: 1.什么是霍夫变换? 2.OpenCV中的霍夫线变换-->直线检测 3.OpenCV中的霍夫圆变换-->圆...

  • 霍夫变换之直线检测

    霍夫变换 查看图像 结果: 边缘检测 结果: 霍夫变换检测直线 结果:

  • 霍夫变换

    霍夫变换——直线   Hough Line Transform用来做直线检测,前提是已经做了边缘检测。  霍夫变换...

  • 霍夫变换

    随机霍夫变换介绍[https://blog.csdn.net/zkl99999/article/details/4...

  • 霍夫变换

    一、霍夫直线检测 霍夫变换(Hough Transfrom),是1972年提出的,最开始就是用来在图像中检测直线,...

  • 霍夫变换

    基本原理 霍夫变换,是将座标由直角座标系变换到极座标系,然后再根据数学表达式检测某些形状(如直线和圆)的方法。当直...

  • 霍夫变换---OpenCV-Python开发指南(35)

    什么是霍夫变换 霍夫变换是一种在图像中寻找直线,圆形以及其他简单形状的方法。霍夫变换采用类似于投票的方式来获取当前...

  • 霍夫变换概述和标准霍夫变换

    在图像处理和计算机视觉领域中,如何冲当前的退选哪个中提取出所需要的特征信息是图像识别的关键所在。在许多应用场合中需...

  • Python+OpenCV教程17:霍夫变换

    主站:http://ex2tron.wang原文:Python+OpenCV教程17:霍夫变换 学习使用霍夫变换识...

网友评论

      本文标题:霍夫变换

      本文链接:https://www.haomeiwen.com/subject/swrstftx.html