Sobel算子/Scharry算子
高斯平滑和微分操作的结合体,抗噪能力好,可设求导方向,当ksize=-1时,会使用3*3的Scharry滤波器
def gradient(image):
image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
sobelx=cv2.Sobel(image,cv2.CV_64F,1,0,ksize=3) #CV_64F存储格式:64位Float,对x方向求一阶导,最多可求二阶导:2,0
sobely=cv2.Sobel(image,cv2.CV_64F,0,1,ksize=3)
title=['original','sobelx','sobley']
images=[image,sobelx,sobely]
plt.figure(figsize=(10,5))
for i in range(3):
plt.subplot(1,3,i+1)
plt.imshow(images[i],'gray')
plt.axis('off')
plt.title(title[i])
plt.show()
gradient(image)
Laplacian算子
def gradient(image):
image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
laplacian=cv2.Laplacian(image,cv2.CV_64F)
title=['original','laplacian']
images=[image,laplacian]
plt.figure(figsize=(10,5))
for i in range(2):
plt.subplot(2,2,i+1)
plt.imshow(images[i],'gray')
plt.axis('off')
plt.title(title[i])
plt.show()
gradient(image)
Canny(边缘检测算子)
def edge_detection(image,minval,maxval):
image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
edges=cv2.Canny(image,minval,maxval) #处于min与max中的值得看相邻点是否为确定边界点
plt.imshow(edges,'gray')
plt.axis('off')
plt.show()
edge_detection(image,100,200)
自动求阈值方法(canny)
def auto_canny(image,sigma=0.33):
image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
v=np.median(image)
lower=int(max(0,(1.0-sigma)*v))
upper=int(min(255,(1.0+sigma)*v))
edged=cv2.Canny(image,lower,upper)
plt.imshow(edged,'gray')
plt.axis('off')
plt.show()
print(lower,upper)
auto_canny(image)