hough 变换
原理
过直角坐标系下的一个点,有无数条线,每条线都有唯一的极坐标表示(ρ,Θ)。在极坐标系下的点,用经过该点的直线极坐标表示为曲线。

说了这么多,这就是原理上hough变换的最底层原理,事实上完全可以自己写程序去实现这些,然而,也说过,hough变换是一个耗时耗力的算法,自己写循环实现通常很慢,曾经用matlab写过这个,也有实际的hough变换例子可以看看:
虹膜识别(三):Hough变换检测内圆边缘
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('line.jpg') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度图像 #open to see how to use: cv2.Canny #http://blog.csdn.net/on2way/article/details/ edges = cv2.Canny(gray,50,200) plt.subplot(121),plt.imshow(edges,'gray') plt.xticks([]),plt.yticks([]) #hough transform lines = cv2.HoughLines(edges,1,np.pi/180,160) lines1 = lines[:,0,:]#提取为为二维 for rho,theta in lines1[:]: a = np.cos(theta) b = np.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv2.line(img,(x1,y1),(x2,y2),(255,0,0),1) plt.subplot(122),plt.imshow(img,) plt.xticks([]),plt.yticks([])
函数cv2.HoughLinesP()是一种概率直线检测,我们知道,原理上讲hough变换是一个耗时耗力的算法,尤其是每一个点计算,即使经过了canny转换了有的时候点的个数依然是庞大的,这个时候我们采取一种概率挑选机制,不是所有的点都计算,而是随机的选取一些个点来计算,相当于降采样了。这样的话我们的阈值设置上也要降低一些。在参数输入输出上,输入不过多了两个参数:minLineLengh(线的最短长度,比这个短的都被忽略)和MaxLineCap(两条直线之间的最大间隔,小于此值,认为是一条直线)。输出上也变了,不再是直线参数的,这个函数输出的直接就是直线点的坐标位置,这样可以省去一系列for循环中的由参数空间到图像的实际坐标点的转换。
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('room.jpg') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度图像 #open to see how to use: cv2.Canny #http://blog.csdn.net/on2way/article/details/ edges = cv2.Canny(gray,50,200) plt.subplot(121),plt.imshow(edges,'gray') plt.xticks([]),plt.yticks([]) #hough transform lines = cv2.HoughLinesP(edges,1,np.pi/180,30,minLineLength=60,maxLineGap=10) lines1 = lines[:,0,:]#提取为二维 for x1,y1,x2,y2 in lines1[:]: cv2.line(img,(x1,y1),(x2,y2),(255,0,0),1) plt.subplot(122),plt.imshow(img,) plt.xticks([]),plt.yticks([])
C++: void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227433.html原文链接:https://javaforall.net
