边缘检测
目录
边缘检测
形态学-腐蚀、膨胀操作
开运算与闭运算
梯度运算
礼帽与黑帽
图像梯度-Sobel算子(右减左,下减上)
图像梯度-Scharr算子
图像梯度-laplacian算子
Canny边缘检测
形态学-腐蚀、膨胀操作
形态学-腐蚀操作,去毛刺儿,腐蚀边界
# 腐蚀核大小
kernel = np.ones((3,3),np.uint8)
# 腐蚀操作:
# img输入图片
# kernel腐蚀核
# iterations迭代次数
erosion = cv2.erode(img,kernel,iterations = 1)
形态学-膨胀操作,膨胀和腐蚀操作作为逆运算
kernel = np.ones((3,3),np.uint8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
开运算与闭运算
开运算:先腐蚀、后膨胀
kernel = np.ones((5,5),np.uint8)
# cv2.MORPH_OPEN开运算参数
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
闭运算:先膨胀、后腐蚀
kernel = np.ones((5,5),np.uint8)
# cv2.MORPH_CLOSE闭运算参数
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
梯度运算
梯度=膨胀-腐蚀(留轮廓)
# cv2.MORPH_GRADIENT梯度运算参数
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
礼帽与黑帽
礼帽 = 原始输入-开运算结果(留毛刺儿)白色更清楚
# cv2.MORPH_TOPHAT礼帽参数
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
黑帽 = 闭运算-原始输入(留原始小轮廓)黑色更清楚
# cv2.MORPH_BLACKHAT黑帽参数
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
图像梯度-Sobel算子(右减左,下减上)
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
Sobel算子函数
src 图像 ddepth 图像深度 dx、dy 水平和竖直方向 ksize Sobel算子的大小
图像深度:是指存储每个像素值所用的位数,例如cv2.CV_8U,指的是8位无符号数,取值范围为0~255,超出范围则会被截断(截断指的是,当数值大于255保留为255,当数值小于0保留为0,其余不变),CV_16S(16位无符号数),CV_16U(16位有符号数),CV_32F(32位浮点数),CV_64F(64位浮点数)
# cv2.CV_64F转换成可带负数的64位浮点数字符格式,便于取绝对值
# dx=1,dy=0计算竖直方向
# 白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
# 取绝对值
sobelx = cv2.convertScaleAbs(sobelx)
# dx=0,dy=1计算水平方向
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
#垂直+水平
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
分开算垂直和水平,再进行相加;不建议直接同时计算垂直和水平dx=1,dy=1,会造成上下左右的缺失,和重影。
图像梯度-Scharr算子
边缘两测差异扩大,对图像差异更加敏感
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
图像梯度-laplacian算子
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
中间点与边缘的差值,对噪声敏感。不建议单独使用
Canny边缘检测
1) 使用高斯滤波器,以平滑图像,滤除噪声。(高斯滤波)
2) 计算图像中每个像素点的梯度强度和方向。(Sobel算子)
3) 应用非极大值(Non-Maximum Suppression)抑制(取最大值),以消除边缘检测带来的杂散响应。
4) 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
5) 通过抑制孤立的弱边缘最终完成边缘检测。
- 非极大值抑制(与切线方向上相邻点比较,若不是最大值舍去)
线性插值
简单化
- 双阈值检测(判断最大值和最小值之间的数值是否连有边界决定是否舍弃)
# maxVal=150,minVal=80v1=cv2.Canny(img,80,150)
阈值越大检测的边界越少,阈值越小检测到的边界越多