cv2小记——图像梯度

99封情书 提交于 2020-02-04 06:25:58
# 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()

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!