我看了很多边缘检测的教程,很多是基于matlab实现的,其实我们如果只是简单的边缘检测,我们可以直接调用已有的opencv的函数。如下
import cv2
import numpy as np
img = cv2.imread('iamge.jpg', 0)
# Sobel实现
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
edges_sobel = np.hypot(sobel_x, sobel_y)
edges_sobel *= 255.0 / np.max(edges_sobel)
# Canny实现
# 第二个第三个参数分别是阈值,用双阈值的方法来决定可能的(潜在的)边界
edges_canny = cv2.Canny(img, 100, 100)
# Laplacian实现
edges_laplacian = cv2.Laplacian(img, cv2.CV_64F)
# Scharr实现
schar_x = cv2.Scharr(img, cv2.CV_64F, 1, 0)
schar_y = cv2.Scharr(img, cv2.CV_64F, 0, 1)
edges_scharr = np.hypot(schar_x, schar_y)
edges_scharr *= 255.0 / np.max(edges_scharr)
然后简单介绍一下原理:
Sobel算子:
Laplacian 算子:
Canny 算子:
下面是效果图: