# OpenCV提供了三种类型的梯度过滤器或者高通滤波器,Sobel,Scharr和Laplacian
cv2.CV_16S
# Sobel算子
# Sobel算子依然是一种过滤器,只是其是带有方向的。在OpenCV-Python中,
# 使用Sobel的算子的函数原型如下:
# dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
# ksize是Sobel算子的大小,必须为1、3、5、7。
# scale是缩放导数的比例常数,默认情况下没有伸缩系数;
# delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;
# borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('black_white2.jpg',0)
'''
在Sobel函数的第二个参数这里使用了cv2.CV_16S。因为OpenCV文档中对Sobel算子的介绍
中有这么一句:Sobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,
即8位无符号数,所以Sobel建立的图像位数不够,会有截断。
因此要使用16位有符号的数据类型,即cv2.CV_16S。
'''
x=cv2.Sobel(img,cv2.CV_16S,1,0,ksize=3)#对x求导
y=cv2.Sobel(img