边缘检测:
边缘检测,针对的是灰度图像,检测图像的边缘是针对图像像素点的一种计算,目的是标识数字图像中灰度变化明显的点,图像的边缘检测在保留图像的重要结构信息的同时,剔除了不相关的信息,大幅度减少了数据量,便于图像的传输和处理
1.Sobel算子:效率高,准确率低
Gx,Gy就是在x,y方向上的梯度
2. Scharr算子:比sobel算子更能体现细节
scharr算子,比sobel算子在比例上要更大,因此这样的好处是scharr算子获得的结果能体现出更多的边缘梯度的细节
cv2.Scharr(src,ddepth, dx, dy), 使用Scharr算子进行计算
参数说明:src表示输入的图片,ddepth表示图片的深度,通常使用-1, 这里使用cv2.CV_64F允许结果是负值, dx表示x轴方向算子,dy表示y轴方向算子
3. Laplacian算子:容易受到噪音点的干扰
import cv2
import numpy as np
# 读取图片
lena = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
# 方法一:使用cv2.sobel进行sobel算子计算
sobel_x = cv2.Sobel(lena, cv2.CV_64F, 1, 0)
sobel_y = cv2.Sobel(lena, cv2.CV_64F, 0, 1)
sobel_x = cv2.convertScaleAbs(sobel_x)
sobel_y = cv2.convertScaleAbs(sobel_y)
sobel_xy = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)
# 方法二:使用cv2.scharr进行scharr算子计算
scharr_x = cv2.Scharr(lena, cv2.CV_64F, 1, 0)
scharr_y = cv2.Scharr(lena, cv2.CV_64F, 0, 1)
scharr_x = cv2.convertScaleAbs(scharr_x)
scharr_y = cv2.convertScaleAbs(scharr_y)
scharr_xy = cv2.addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0)
# 方法三: 使用cv2.laplacian 拉普拉斯算子计算
lapkacian = cv2.Laplacian(lena, cv2.CV_64F)
lapkacian = cv2.convertScaleAbs(lapkacian)
# 结果对比: 对三种结果进行画图
cv2.imshow('imgs', np.hstack((sobel_xy, scharr_xy, lapkacian)))
cv2.waitKey(0)
cv2.destroyAllWindows()
4.canny边缘检测
cv2.Canny(src, minvalue, maxvalue) 进行canny边缘检测
参数说明: src表示输入的图片, thresh1表示最小阈值,thresh2表示最大阈值,用于进一步删选边缘信息
其中:当minval和maxval越小时,所保留的边缘信息更多
原理:
第一步:使用高斯滤波器进行滤波,去除噪音点
第二步:使用sobel算子,计算出每个点的梯度大小和梯度方向
第三步:使用非极大值抑制(只有最大的保留),消除边缘检测带来的杂散效应
第四步:应用双阈值,来确定真实和潜在的边缘
第五步:通过抑制弱边缘来完成最终的边缘检测
import cv2
import numpy as np
img = cv2.imread('lena.jpg')
v1 = cv2.Canny(img, 80, 150)
v2 = cv2.Canny(img, 50, 100)
ret = np.hstack((v1, v2))
cv2.imshow('img', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()