图像梯度

我们知道一阶导数可以用来求极值。把图片想象成连续函数,因为边缘部分的像素值与旁边的像素明显有区别,所以对图片局部求极值,就可以得到整幅图片的边缘信息。不过图片是二维的离散函数,导数就变成了差分,这个查分就变成了图像梯度。

1. 垂直边缘提取

滤波是应用卷积来实现的,卷积的关键就是卷积核。我们来考察下面这个卷积核:

这个核是用来提取图片中的垂直边缘的,怎么做到的呢?看下图:

当前列左右两侧的元素进行差分,由于边缘的值明显小于(或大于)周边像素,所以边缘的差分结果会明显不同,这样就提取出垂直边缘。同理,把上面的那个矩阵转置一下,就是提取水平边缘。这种差分操作就成为图像的梯度计算:

import cv2
import numpy as np img = cv2.imread('sudoku.jpg', 0) # 自己进行垂直边缘提取
kernel = np.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]], dtype=np.float32) dst_v = cv2.filter2D(img, -1, kernel) # 自己进行水平边缘提取
dst_h = cv2.filter2D(img, -1, kernel.T) # 横向并排对比显示
cv2.imshow('edge', np.hstack((img, dst_v, dst_h)))
cv2.waitKey(0)

2. Sobel算子

上面这种差分方法就叫Sobel算子,它先在垂直方向上计算梯度 Gx = k1 x src,再在水平方向计算梯度Gy = k2 x src,最后求出总梯度:

我们可以把前面的代码用Sobel算子更简单的实现:

sobelx = cv2.Sobel(img, -1, 1, 0, ksize=3) # 只计算x方向
sobely = cv2.Sobel(img, -1, 0, 1, ksize=3) # 只计算y方向
# 横向并排对比显示
cv2.imshow('edge', np.hstack((img, sobelx, sobely)))
cv2.waitKey(0)

还有其他算子,比如只利用领域间的原始差值来检测边缘的Prewitt算子

还有比Sobel更好用的Scharr算子

这些算法都是一阶边缘检测的代表。

3. Laplacian算子

高数中用一阶导数求极值,在这些极值的地方,二阶导数为0,所以也可以求二阶导计算梯度:

一维的一阶和二阶差分公式分别为:

提取前面的系数,那么一维的Laplacian的滤波核是:

对于二维函数f(x,y),两个方向的二阶差分分别是:

合在一起:

同样提取前面的系数,那么二维的Laplacian滤波核就是:

这就是 Laplacian 算子的图像卷积模板,有些资料在此基础上考虑斜对角情况,将卷积核扩展为:

laplacian = cv2.Laplacian(img, -1)
# 横向并排对比显示
cv2.imshow('edge', np.hstack((img, laplacian)))
cv2.waitKey(0)

Laplacian算子是二阶边缘检测的典型代表。

参考地址:http://ex2tron.wang/opencv-python-extra-image-gradients/

OpenCV-Python-图像梯度的更多相关文章

  1. 12、OpenCV Python 图像梯度

    __author__ = "WSX" import cv2 as cv import numpy as np def lapalian_demo(image): #拉普拉斯算子 # ...

  2. opencv:图像梯度

    常见的图像梯度算子: 一阶导数算子: #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; ...

  3. opencv python 图像二值化/简单阈值化/大津阈值法

    pip install matplotlib 1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表 ...

  4. 11、OpenCV Python 图像金字塔

    __author__ = "WSX" import cv2 as cv import numpy as np # 高斯金字塔 #金字塔 原理 ==> 高斯模糊+ 降采样 #金 ...

  5. 10、OpenCV Python 图像二值化

    __author__ = "WSX" import cv2 as cv import numpy as np #-----------二值化(黑0和白 255)---------- ...

  6. 8、OpenCV Python 图像直方图

    __author__ = "WSX" import cv2 as cv import numpy as np from matplotlib import pyplot as pl ...

  7. 1、OpenCV Python 图像加载和保存

    __author__ = "WSX" import cv2 as cv # 这里的文件是图片或者视频 def Save_File( image ): cv.imwrite(&quo ...

  8. 2、OpenCV Python 图像属性获取

    __author__ = "WSX" import cv2 as cv import numpy as np image = cv.imread("1.JPG" ...

  9. Python+OpenCV图像处理(十二)—— 图像梯度

    简介:图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导. Sobel算子是普通一阶差分,是基于寻找梯度强度.拉普拉斯算子(二阶差分)是基于过零点检测.通过计算梯度,设置阀值, ...

  10. opencv python:图像梯度

    一阶导数与Soble算子 二阶导数与拉普拉斯算子 图像边缘: Soble算子: 二阶导数: 拉普拉斯算子: import cv2 as cv import numpy as np # 图像梯度(由x, ...

随机推荐

  1. Linux下MySql的登陆和管理操作

    一.mysql数据库启停1.linux下启动mysql的命令:    mysqladmin start/ect/init.d/mysql start (前面为mysql的安装路径)2.linux下重启 ...

  2. 为知笔记Linux版编译使用记录

    本文档长期不定时更新,根据使用情况进行反馈. 目录 编译 Error creating SSL context 无法输入中文 如何打包使用 桌面图标 Markdown Windows 版本差异 常用快 ...

  3. logback输出json格式日志(包括mdc)发送到kafka

    1,pom.xml <!-- kafka --> <dependency> <groupId>com.github.danielwegener</groupI ...

  4. 深入了解SQL的四种连接&不然要命的!

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  5. Money King【题解】

    我又傻了……竟然忘了区别大根堆和小根堆的性质,以至于一个符号打错,debug了半天……(我真是太菜了……) 题目描述 Once in a forest, there lived N aggressiv ...

  6. Springboot集成Quartz

    之前学习过spring的定时任务 :https://www.cnblogs.com/slimshady/p/10112515.html 本文主要学习记录下springboot使用quartz 1.   ...

  7. 帕斯卡(pascal)命名法:

    帕斯卡(pascal)命名法: 与骆驼命名法类似.只不过骆驼命名法是首字母小写,而帕斯卡命名法是首字母大写 如:public void DisplayInfo(); string UserName; ...

  8. arcgis图层 GraphicsLayer与FeatureLayer

    什么是图层 图层是用来在 ArcGIS 产品套件中显示地理数据集的机制.每个图层代表一种数据集(可以是地图服务.图形或是矢量数据),并指定该数据集是如何描绘使用一组属性的. 包含一个地图控件的每个应用 ...

  9. [Reinforcement Learning] Model-Free Control

    上篇总结了 Model-Free Predict 问题及方法,本文内容介绍 Model-Free Control 方法,即 "Optimise the value function of a ...

  10. AIC与BIC

    首先看几个问题 1.实现参数的稀疏有什么好处? 一个好处是可以简化模型.避免过拟合.因为一个模型中真正重要的参数可能并不多,如果考虑所有的参数作用,会引发过拟合.并且参数少了模型的解释能力会变强. 2 ...