我看了很多边缘检测的教程,很多是基于matlab实现的,其实我们如果只是简单的边缘检测,我们可以直接调用已有的opencv的函数。如下
import cv2import numpy as npimg = 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 算子:
下面是效果图: