图像处理(八):线段检测之Hough变换
来源:互联网 发布:java单例模式好处 编辑:程序博客网 时间:2024/05/29 08:25
现阶段用最多的线段检测算法为Hough变换,对于Hough变换的原理部分已经有很多人写过,具体可以参考:点击打开链接,这里我总结一下理解Hough变换算法的难点。
一、直线表示方法:
1)最常用的方法为斜截式:y=kx+b,已知直线的斜率及y轴上的截距,即可确定一条直线。
2)Hough变换中参数方程:rho = x * cos(theta) + y * sin(theta),原理部分一般都会介绍,每一对(rho, theta)对应一条直线,为什么?可以看一下下面这个图
可以看到,这里的rho和theta分别对应于原点到直线y=kx+b的距离以及这条垂线对应夹角。知道这两个东西,自然就可以知道一条直线。
二、实现步骤
1)灰度化,并使用Canny进行边缘检测;
2)参数空间离散化:确定检测精度;
3)Hough参数空间统计;
4)四邻域非极大值抑制;
三、代码如下:
#include <opencv2/opencv.hpp>#include <math.h>using namespace cv;using namespace std;//用来表示极坐标参数空间里的数据struct Para {int num;float angle;int rho;};int main(){Mat src = imread("1.jpg");Mat gray;cvtColor(src, gray, CV_BGR2GRAY);Mat edges;Canny(gray, edges, 50, 200);int i, j, k;// hough transformint q_max = sqrt(pow(gray.rows, 2) + pow(gray.cols, 2));int nAngles = 180; // 划分为180份// 为hough参数空间分配内存及初始化int ** hough_data = new int*[q_max];for (i = 0; i < q_max; i++){hough_data[i] = new int[nAngles];for (j = 0; j < nAngles; j++){hough_data[i][j] = 0;}}// Hough参数空间统计for (i = 0; i < edges.rows; i++)for (j = 0; j < edges.cols; j++){if (edges.at<uchar>(i,j) == 255){int index = 0;for (k = 0; k < nAngles; k++){index = int(i * cos(CV_PI / nAngles * k) + j * sin(CV_PI / nAngles * k));index = int( (index + q_max) / 2 );hough_data[index][k]++;}}}// 统计之后进行非极大值抑制Para *houghSpace = new Para[q_max * nAngles];int thr = 200;int counts = 0;for (i = 0; i < q_max; i++)for (j = 0; j < nAngles; j++){// 大于阈值且为四邻域的极大值if (hough_data[i][j] > thr &&hough_data[i][j] > hough_data[i + 1][j] && hough_data[i][j] > hough_data[i - 1][j] &&hough_data[i][j] > hough_data[i][j + 1] &&hough_data[i][j] > hough_data[i][j - 1]){houghSpace[counts].rho = i * 2 - q_max;houghSpace[counts].angle = j * CV_PI / nAngles;houghSpace[counts].num = hough_data[i][j];counts++;}}// 得到了参数之后,画线for (k = 0; k < counts; k++){if (houghSpace[k].angle < 0.1){line(src, Point(0, houghSpace[k].rho), Point(src.cols, houghSpace[k].rho), Scalar(255, 0, 0));}else{line(src, Point(houghSpace[k].rho / sin(houghSpace[k].angle), 0), Point( 0, (houghSpace[k].rho / cos(houghSpace[k].angle))), Scalar(255, 0, 0));}}delete[] hough_data;delete[] houghSpace;imshow("edges", edges);imshow("hough", src);waitKey();return 0;}
效果如下:
阅读全文
0 0
- 图像处理(八):线段检测之Hough变换
- HOUGH变换检测线段
- 图像处理之霍夫变换(Hough)
- 图像处理之_霍夫(Hough)变换
- OpenCV图像处理篇之Hough变换
- Hough变换的线段检测
- 图像处理 C语言 hough变换 检测直线
- 图像处理 C语言 hough变换 检测直线
- 图像变换-使用Hough变换检测圆
- 数字图像处理—图像分割—哈夫(Hough)变换及哈夫变换原理—检测直线
- Hough变换之直线检测
- MATLAB图像处理-霍夫变换检测图像中的线段
- 图像处理————霍夫(HOUGH)变换
- 图像处理基本算法 Hough变换
- 图像处理中Hough变换笔记
- 图像处理之霍夫变换(直线检测算法)
- 图像处理之霍夫变换(直线检测算法)
- 图像处理之霍夫变换(直线检测算法)
- IE下 JS传参出现中文乱码解决
- 【Scikit-Learn 中文文档】概率校准
- React-Music 全家桶项目,精品之作!
- oracle 新增sequence时通过其查询表或者sequence来确定start with的值
- HDU2011
- 图像处理(八):线段检测之Hough变换
- iOS界面卡死但不崩溃
- 结局electron模块打包时下载插件慢
- Debug下正常,而Release失败的真正原因
- scikit-learn 中文文档-高斯混合模型-无监督学习|ApacheCN
- SpringMVC创建
- 【Scikit-Learn 中文文档】神经网络模块(监督的)- 监督学习
- java输入输出流
- 超链接的target属性使用