OPENCV---边缘检测

边缘检测

  • 个人理解
  • Sobel检测算子
  • Scharr检测算子
  • Laplacian算子
  • Canny边缘检测
  • 算法比较

原理:
边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘的表现形式如下图所示:
OPENCV---边缘检测_第1张图片

个人理解

我觉得边缘检测可以用来识别物体的形状来判断一些东西

Sobel检测算子

API:

Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
#src:传入的图像
#ddepth: 图像的深度
#dx和dy: 指求导的阶数,0表示这个方向上没有求导,取值为0、1。
#ksize: 是Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7,默认为3。
#注意:如果ksize=-1,就演变成为3x3的Scharr算子。
#scale:缩放导数的比例常数,默认情况为没有伸缩系数。
#borderType:图像边界的模式,默认值为cv2.BORDER_DEFAULT。

#Sobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以Sobel建立的图像位数不够,会有截断。因此要使用16位有符号的数据类型,即cv2.CV_16S。处理完图像后,再使用cv2.convertScaleAbs()函数将其转回原来的uint8格式,否则图像无法显示。

Sobel算子是在两个方向计算的,最后还需要用cv2.addWeighted( )函数将其组合起来

Scale_abs = cv2.convertScaleAbs(x)  # 格式转换函数
result = cv2.addWeighted(src1, alpha, src2, beta) # 图像混合

Scharr检测算子

将上述代码中计算sobel算子的部分中将ksize设为-1,就是利用Scharr进行边缘检测。

x = cv.Sobel(img, cv.CV_16S, 1, 0, ksize = -1)
y = cv.Sobel(img, cv.CV_16S, 0, 1, ksize = -1)

Laplacian算子

API: laplacian = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
Src: 需要处理的图像,
Ddepth: 图像的深度,-1表示采用的是原图像相同的深度,目标图像的深度必须大于等于原图像的深度;
ksize:算子的大小,即卷积核的大小,必须为1,3,5,7。

Canny边缘检测

API:canny = cv2.Canny(image, threshold1, threshold2)
image:灰度图,
threshold1: minval,较小的阈值将间断的边缘连接起来
threshold2: maxval,较大的阈值检测图像中明显的边缘

算法比较

OPENCV---边缘检测_第2张图片

你可能感兴趣的:(openCV(python))