1.高斯模糊算法
blur_gray = cv2.GaussianBlur(gray,(kernel_size,kernel_size),0)
Mathematically, applying a Gaussian blur to an image is the same as convolving the image with a Gaussian function.
数学上讲,对图像做高斯模糊等同于将图像与高斯函数卷积。
Since the Fourier transform of a Gaussian is another Gaussian, applying a Gaussian blur has the effect of reducing the image’s high-frequency components; a Gaussian blur is thus a low pass filter.
由于高斯分布的傅里叶变换仍然是高斯分布,使用高斯模糊就减少了图像的高频分量,因此高斯模糊是低通滤波器。
参数:
gray为灰度图;
(kernel_size,kernel_size):表示高斯矩阵的长与宽都是kernel_size,第三个参数0为高斯矩阵的标准差。
高斯模糊本质上是低通滤波器,输出图像的每个像素点是原图像上对应像素点与周围像素点的加权和,原理并不复杂,就是用高斯分布权值矩阵与原始图像矩阵做卷积运算而已。类似神经网络中卷积层的卷积。
这里(kernel_size,kernel_size)表示高斯矩阵的长与宽都是kernel_size,标准差取0时OpenCV会根据高斯矩阵的尺寸自己计算。概括地讲,高斯矩阵的尺寸越大,标准差越大,处理过的图像模糊程度越大。
2.Canny边缘检测算法
edges = cv2.Canny(blur_gray, low_threshold, high_threshold)
参数:
blur_gray为模糊后的灰度图;
low_threshold为阈值下界;
high_threshold阈值上界;两阈值用来判断梯度大小。
Canny算法的基本思想是找寻一幅图像中灰度强度变化最强的位置。所谓变化最强,即指梯度最大。平滑后的图像中每个像素点的梯度可以由Sobel算子(一种卷积运算)来获得(opencv中有封装好的函数,可以求图像中每个像素点的n阶导数)。
首先,利用如下的核来分别求得沿水平(x)和垂直(y)方向的梯度G_X和G_Y。
K_{GX} = [-1 0 1; -2 0 2; -1 0 1], K_{GY} = [-1 -2 -1; 0 0 0; 1 2 1]
之后,便可利用公式来求得每一个像素点的梯度值,
3.霍夫变换
lines = cv2.HoughLinesP(edges, rho, theta, threshold, np.array([]),
min_line_length, max_line_gap)
参数:
edges: 必须是二值图像,推荐使用canny边缘检测的结果图像;
rho: 线段以像素为单位的距离精度,double类型的,推荐用1.0;
theta: 线段以弧度为单位的角度精度,推荐用np.pi/180;
threshold: 累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少;
np.array([]) 这个参数为占位符,对结果无影响;
min_line_length: 线段以像素为单位的最小长度,根据应用场景设置;
max_line_gap: 同一方向上两条线段判定为一条线段的最大允许间隔(断裂),超过了设定值,则把两条线段当成一条线段,值越大,允许线段上的断裂越大,越有可能检出潜在的直线段。