具体请参照Canny 边缘检测
步骤:
此步为更好地排除非边缘像素, 仅仅保留了一些细线条(候选边缘)。
import cv2 as cv
import numpy as np
def canny_detect(image):
src = cv.imread(image)
blurred = cv.GaussianBlur(src, (3,3), 0) # 高斯模糊,去除干扰噪点
gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY) # 转化为灰度图
# X gradient
gradx = cv.Sobel(gray, cv.CV_16SC1, 1, 0)
# Y gradient
grady = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
# edge
edge_output = cv.Canny(gradx, grady, 50, 150) # 利用x,y 轴梯度对图像进行边缘提取
cv.imshow('customary', src)
cv.imshow('result', edge_output)
canny_detect('/home/pi/Desktop/woman.jpg')
cv.waitKey(0)
cv.destroyAllWindows()
还可以输出彩色边缘:
colorful = cv.bitwise_and(src, src, mask=edge_output) # 与原图像进行“与”操作
其实直接对原图像或高斯模糊后图像亦或灰度图进行canny 边缘提取也是可以的,只不过,效果没有那么好。
其中直接对原图进行边缘提取效果最差,高斯模糊后消去噪声会好很多…