OpenCV
4.5.0pre
Open Source Computer Vision

OpenCV provides three types of gradient filters or Highpass filters, Sobel, Scharr and Laplacian. We will see each one of them.
Sobel operators is a joint Gausssian smoothing plus differentiation operation, so it is more resistant to noise. You can specify the direction of derivatives to be taken, vertical or horizontal (by the arguments, yorder and xorder respectively). You can also specify the size of kernel by the argument ksize. If ksize = 1, a 3x3 Scharr filter is used which gives better results than 3x3 Sobel filter. Please see the docs for kernels used.
We use the functions: cv.Sobel (src, dst, ddepth, dx, dy, ksize = 3, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT)
src  input image. 
dst  output image of the same size and the same number of channels as src. 
ddepth  output image depth(see cv.combinations); in the case of 8bit input images it will result in truncated derivatives. 
dx  order of the derivative x. 
dy  order of the derivative y. 
ksize  size of the extended Sobel kernel; it must be 1, 3, 5, or 7. 
scale  optional scale factor for the computed derivative values. 
delta  optional delta value that is added to the results prior to storing them in dst. 
borderType  pixel extrapolation method(see cv.BorderTypes). 
cv.Scharr (src, dst, ddepth, dx, dy, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT)
src  input image. 
dst  output image of the same size and the same number of channels as src. 
ddepth  output image depth(see cv.combinations). 
dx  order of the derivative x. 
dy  order of the derivative y. 
scale  optional scale factor for the computed derivative values. 
delta  optional delta value that is added to the results prior to storing them in dst. 
borderType  pixel extrapolation method(see cv.BorderTypes). 
It calculates the Laplacian of the image given by the relation, \(\Delta src = \frac{\partial ^2{src}}{\partial x^2} + \frac{\partial ^2{src}}{\partial y^2}\) where each derivative is found using Sobel derivatives. If ksize = 1, then following kernel is used for filtering:
\[kernel = \begin{bmatrix} 0 & 1 & 0 \\ 1 & 4 & 1 \\ 0 & 1 & 0 \end{bmatrix}\]
We use the function: cv.Laplacian (src, dst, ddepth, ksize = 1, scale = 1, delta = 0, borderType = cv.BORDER_DEFAULT)
src  input image. 
dst  output image of the same size and the same number of channels as src. 
ddepth  output image depth. 
ksize  aperture size used to compute the secondderivative filters. 
scale  optional scale factor for the computed Laplacian values. 
delta  optional delta value that is added to the results prior to storing them in dst. 
borderType  pixel extrapolation method(see cv.BorderTypes). 
In our last example, output datatype is cv.CV_8U. But there is a slight problem with that. BlacktoWhite transition is taken as Positive slope (it has a positive value) while WhitetoBlack transition is taken as a Negative slope (It has negative value). So when you convert data to cv.CV_8U, all negative slopes are made zero. In simple words, you miss that edge.
If you want to detect both edges, better option is to keep the output datatype to some higher forms, like cv.CV_16S, cv.CV_64F etc, take its absolute value and then convert back to cv.CV_8U. Below code demonstrates this procedure for a horizontal Sobel filter and difference in results.