canny算法(在opencv中有相应的API)
边缘检测算法
一个很好的边缘检测器
canny算法介绍——5步
1、高斯模糊——GaussianBlur
2、灰度变换——cvtColor
3、计算梯度——Sobel/Scharr
4、非最大信号抑制
5、高低阈输出二值图像:T1,T2都为阈值,凡是高于T2的都保留,凡是小于T1的都丢弃,从高于T2的像素出发,凡是大于T1的而且相互连接的都保留,最终得到一个输出二值图像。
推荐的高低阈值比值为T2:T1=3:1/2:1,其中T2为高阈值,T1为低阈值
from matplotlib import pyplot as plt
from cv2 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)
#求梯度
xgrd = cv.Sobel(gray,cv.CV_16SC1,1,0)
ygrd = cv.Sobel(gray,cv.CV_16SC1,0,1)
egde_output = cv.Canny(xgrd,ygrd,50,150) #50低阈值,150高阈值
#egde_output = cv.Canny(gray,50,150) #都可使用
cv.imshow('canny_edge',egde_output)
#输出彩色图
dst = cv.bitwise_and(image,image,mask=egde_output)
cv.imshow('color edge',dst)
if __name__ == "__main__":
filepath = "C:\\pictures\\012345.jpg"
img = cv.imread(filepath) # blue green red
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",img)
edge_demo(img)
cv.waitKey(0)
cv.destroyAllWindows()
结果如下: