时间:2021-05-20
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:检测到的直线的最大角度
示例代码:
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
示例代码:
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变换结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了python+opencv实现霍夫变换检测直线的具体代码,供大家参考,具体内容如下python+opencv实现高斯平滑滤波python+o
我尝试了两种方式用opencv对指针仪表进行读数识别,1.先模板匹配,然后边缘检测+霍夫直线2.按轮廓大小过滤,然后边缘检测+霍夫直线两种方式对光线都非常敏感其
python+opencv车道线检测(简易实现),供大家参考,具体内容如下技术栈:python+opencv实现思路:1、canny边缘检测获取图中的边缘信息;
利用Opencv中的Houghline方法进行直线检测—python语言这是给Python部落翻译的文章,请在这里看原文。在图像处理中,霍夫变换用来检测任意能够
参照opencv官网例程写了一个基于python的行人检测程序,实现了和自带检测器基本一致的检测效果。网址:https://docs.opencv.org/3.