# coding: utf-8
# !/usr/bin/python
"""
@File : 图像梯度.py
@Author : jiaming
@Modify Time: 2020/2/3 12:13
@Contact : https://blog.csdn.net/weixin_39541632
@Version : 1.0
@Desciption : 图像梯度、图像边界
cv2.Sobel() cv2.Schar() cv2.Laplacian()
"""
import os
import sys
import numpy as np
import cv2
import pprint
from matplotlib import pyplot as plt
rawPath = os.path.abspath(__file__)
currentFile = os.path.basename(sys.argv[0])
dataPath = rawPath[:rawPath.find(currentFile)] + r'static\\'
"""
OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel、 Scharr、 Laplacian
"""
"""
Sobel 算子和 Scharr 算子
Sobel 算子是高斯平滑与与微积分操作的结合体,所以它的抗噪声能力很好。你可以设定求导的方向(xorder、yorder)。
还可以设定使用的卷积核的大小(ksize),如果 ksize=-1,会使用3x3的 Scharr 滤波器,它的效果要比
3x3的 Sobel 滤波器好。
"""
"""
Laplacian 算子
拉普拉斯算子可以使用二阶导数的形式定义,可假设其离散实现类似于二阶 Sobel 导数,事实上,OpenCV
在计算拉普拉斯算子时直接调用 Sobel 算子。
"""
img = cv2.imread(dataPath + 'j.png', 0)
laplacian = cv2.Laplacian(img, cv2.CV_64F) # 注意这里的depth参数!
# cv2.CV_64F 输出图像的深度(数据类型),可以使用-1,与原图像保持一致
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
# 参数1,0表示在x方向求一阶导数,最大可以求2阶导数
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
# 同理0,1表示在y方向求一阶导数,最大可以求二阶导数
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(laplacian, cmap='gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(sobelx, cmap='gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(sobely, cmap='gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()
来源:CSDN
作者:Jia ming
链接:https://blog.csdn.net/weixin_39541632/article/details/104154849