hough变换是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合特定形状的集合作为hough变换结果。
发展史:
1962年由paulhough首次提出,用来检测直线和曲线。
1972年由richard duda & peter hart推广使用,扩展到任意形状物体的识别。
原理:
一条直线在直角坐标系下的表示形式为y=k*x+b,而在极坐标系下表示为r=x*cos(theta)+y*sin(theta)。hough变换的思想为在直角坐标系下的一个点对应极坐标系下的一条直线,同样,极坐标系下的一个点对应直角坐标系下的一条直线。在直角坐标系中的直线,斜率和截距是一定的,这样这条直线上的所有点在极坐标系中聚焦于一点,这样的聚焦点就代表了直角坐标系中的直线。
对于直线x=c,在实际应用中,是采用参数方程p=x*cos(theta)+y*sin(theta)。这样,图像平面上的一个点就对应到参数r—theta平面上的一条曲线上,其它的还是一样。
标准hough变换:
imgproc.houghlines(mat image, mat lines, double rho, double theta, int threshold, double srn, double stn, double min_theta, double max_theta)
参数说明:
image:源图像
lines:hough变换后储存检测到的线条的输出矢量
rho:以像素为单位的距离精度
theta:以弧度为单位的角度精度
threshold:识别某部分为一条直线时必须达到的值
srn:rho参数的除数距离,有默认值0
stn:theta参数的除数距离,默认值0
min_theta:检测到的直线的最小角度
max_theta:检测到的直线的最大角度
示例代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
public static void main(string[] args)
{
system.loadlibrary(core.native_library_name);
mat srcimage = imgcodecs.imread("f:\\\\6597210504144579394.jpg");
mat dstimage = srcimage.clone();
imgproc.canny(srcimage, dstimage, 400, 500, 5, false);
mat storage = new mat();
imgproc.houghlines(dstimage, storage, 1, math.pi / 180, 200, 0, 0, 0, 10);
for (int x = 0; x < storage.rows(); x++)
{
double[] vec = storage.get(x, 0);
double rho = vec[0];
double theta = vec[1];
point pt1 = new point();
point pt2 = new point();
double a = math.cos(theta);
double b = math.sin(theta);
double x0 = a * rho;
double y0 = b * rho;
pt1.x = math.round(x0 + 1000 * (-b));
pt1.y = math.round(y0 + 1000 * (a));
pt2.x = math.round(x0 - 1000 * (-b));
pt2.y = math.round(y0 - 1000 * (a));
if (theta >= 0)
{
imgproc.line(srcimage, pt1, pt2, new scalar(255, 255, 255, 255), 1, imgproc.line_4, 0);
}
}
imgcodecs.imwrite("f:\\\\dst2.jpg", srcimage);
}
|
累计概率hough变换:
imgproc.houghlinesp(mat image, mat lines, double rho, double theta, int threshold, double minlinelength, double maxlinegap)
参数说明:
image:源图像
lines:hough变换后储存检测到的线条的输出矢量
rho:以像素为单位的距离精度
theta:以弧度为单位的角度精度
threshold:识别某部分为一条直线时必须达到的值
minlinelength:最低线段的长度,默认为0
maxlinegap:允许将同一行点与点之间连接起来的最大的距离,默认为0
示例代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public static void main(string[] args)
{
system.loadlibrary(core.native_library_name);
mat srcimage = imgcodecs.imread("f:\\\\6597210504144579394.jpg");
mat dstimage = srcimage.clone();
imgproc.canny(srcimage, dstimage, 400, 500, 5, false);
mat storage = new mat();
imgproc.houghlinesp(dstimage, storage, 1, math.pi / 180, 50, 0, 0);
for (int x = 0; x < storage.rows(); x++)
{
double[] vec = storage.get(x, 0);
double x1 = vec[0], y1 = vec[1], x2 = vec[2], y2 = vec[3];
point start = new point(x1, y1);
point end = new point(x2, y2);
imgproc.line(srcimage, start, end, new scalar(255, 255, 255, 255), 1, imgproc.line_4, 0);
}
imgcodecs.imwrite("f:\\\\dst2.jpg", srcimage);
}
|
源图片:
标准hough变换结果:
累计概率hough变换结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
原文链接:http://blog.csdn.net/m1109048058/article/details/77334309
相关文章
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
详解eclipse将项目打包成jar文件的两种方法及问题解决方法
2025-05-29 55 -
2025-05-25 31
-
2025-05-25 74
-
基于ubuntu16 Python3 tensorflow(TensorFlow环境搭建)
2025-05-25 53 -
如何在ubuntu下安装wine?在ubuntu下安装wine的方法
2025-05-27 73




