目录
边缘检测
形态学-腐蚀、膨胀操作
开运算与闭运算
梯度运算
礼帽与黑帽
图像梯度-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=80 v1=cv2.Canny(img,80,150)
阈值越大检测的边界越少,阈值越小检测到的边界越多