目录
1、edge_output = cv.Canny(xgrad, ygrad, 50, 150)
2、edge_output = cv.Canny(gray, 50, 150)
canny边缘检测算法是图像分析中较为重要的一步,在这篇文章主要介绍使用openCV API实现边缘检测算法
集体每一步如何详细实现的推荐:https://www.cnblogs.com/nowgood/p/cannyedge.html
一、canny算法介绍五步
-
高斯模糊,使用高斯滤波器,以平滑图像,滤除噪声——GaussianBlur
-
灰度转换——cvtClolor
-
计算图像中每个像素点的梯度强度和方向——Sobel/Scharr
-
非最大信号抑制,以消除边缘检测带来的杂散响应。
-
应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘
二、函数实现代码
由下面运行结果可以看出来,两种重载Canny()实现的效果相差不大
import cv2 as cv
import numpy as np
def edge_demo(image):
blurred = cv.GaussianBlur(image, (3, 3), 0)#高斯模糊
gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)#灰度转换
# X Gradient 计算梯度
xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0)
# Y Gradient
ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
#edge
edge_output = cv.Canny(xgrad, ygrad, 50, 150)
#edge_output = cv.Canny(gray, 50, 150)#注意这一步和上面一行一样都是做边缘检测,cv.Canny()算法重载了多种入参方式,会有不同的结果
cv.imshow("Canny Edge", edge_output)
dst = cv.bitwise_and(image, image, mask=edge_output)
cv.imshow("Color Edge", dst)
print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/javaopencv/images/timg.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
edge_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()