边缘检测

目录

边缘检测

形态学-腐蚀、膨胀操作

开运算与闭运算

梯度运算

礼帽与黑帽

图像梯度-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算子(右减左,下减上)

opencv锯齿边缘 平滑 opencv 边缘检测与抠图_opencv

 

opencv锯齿边缘 平滑 opencv 边缘检测与抠图_计算机视觉_02

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算子

边缘两测差异扩大,对图像差异更加敏感

opencv锯齿边缘 平滑 opencv 边缘检测与抠图_opencv_03

 

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算子

opencv锯齿边缘 平滑 opencv 边缘检测与抠图_opencv_04

laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

中间点与边缘的差值,对噪声敏感。不建议单独使用

Canny边缘检测

1) 使用高斯滤波器,以平滑图像,滤除噪声。(高斯滤波)

2) 计算图像中每个像素点的梯度强度和方向。(Sobel算子)

3) 应用非极大值(Non-Maximum Suppression)抑制(取最大值),以消除边缘检测带来的杂散响应。

4) 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。

5) 通过抑制孤立的弱边缘最终完成边缘检测。

  • 非极大值抑制(与切线方向上相邻点比较,若不是最大值舍去)

线性插值

opencv锯齿边缘 平滑 opencv 边缘检测与抠图_python_05

 

简单化

opencv锯齿边缘 平滑 opencv 边缘检测与抠图_边缘检测_06

 

  • 双阈值检测(判断最大值和最小值之间的数值是否连有边界决定是否舍弃)

opencv锯齿边缘 平滑 opencv 边缘检测与抠图_opencv锯齿边缘 平滑_07

 

# maxVal=150,minVal=80v1=cv2.Canny(img,80,150)

阈值越大检测的边界越少,阈值越小检测到的边界越多