【OpenCV 例程300篇】250. 梯度算子的传递函数

『youcans 的 OpenCV 例程300篇 - 总目录』


【youcans 的 OpenCV 例程300篇】250. 梯度算子的传递函数


1. 空间卷积与频域滤波

空间域图像滤波是图像与滤波器核的卷积,而空间卷积的傅里叶变换是频率域中相应变换的乘积,因此频率域图像滤波是频率域滤波器(传递函数)与图像的傅里叶变换相乘。频率域中的滤波概念更加直观,滤波器设计也更容易。

对于二维图像处理,通常使用 x,yx, yx,y 表示离散的空间域坐标变量,用 u,vu,vu,v 表示离散的频率域变量。二维离散傅里叶变换(DFT)和反变换(IDFT)为:

F(u,v)=∑x=0M−1∑y=0N−1f(x,y)e−j2π(ux/M+vy/N)f(x,y)=1MN∑u=0M−1∑v=0N−1F(u,v)ej2π(ux/M+vy/N)\begin{aligned} F(u,v) &= \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x,y) e^{-j 2\pi (ux/M+vy/N)}\\ f(x,y) &= \frac{1}{MN} \sum_{u=0}^{M-1} \sum_{v=0}^{N-1} F(u,v) e^{j 2\pi (ux/M+vy/N)} \end{aligned} F(u,v)f(x,y)=x=0M1y=0N1f(x,y)ej2π(ux/M+vy/N)=MN1u=0M1v=0N1F(u,v)ej2π(ux/M+vy/N)

空间取样和频率间隔是相互对应的,频率域所对应的离散变量间的间隔为:Δu=1/MΔT,Δv=1/NΔZ\Delta u = 1/M \Delta T,\Delta v = 1/N \Delta ZΔu=1/MΔTΔv=1/NΔZ。即:频域中样本之间的间隔,与空间样本之间的间隔及样本数量的乘积成反比。

空间域滤波器和频率域滤波器也是相互对应的,形成一个傅里叶变换对:
f(x,y)⊗h(x,y)⇔F(u,v)H(u,v)f(x,y)h(x,y)⇔F(u,v)⊗H(u,v)f(x,y) \otimes h(x,y) \Leftrightarrow F(u,v)H(u,v) \\f(x,y) h(x,y) \Leftrightarrow F(u,v) \otimes H(u,v) f(x,y)h(x,y)F(u,v)H(u,v)f(x,y)h(x,y)F(u,v)H(u,v)

这表明 F 和 H 分别是 f 和 h 的傅里叶变换;f 和 h 的空间卷积的傅里叶变换,是它们的变换的乘积。

因此,计算两个函数的空间卷积,可以直接在空间域计算,也可以在频率域计算:先计算每个函数的傅里叶变换,再对两个变换相乘,最后进行傅里叶反变换转换回空间域。

也就是说,空间域滤波器和频率域滤波器实际上是相互对应的,也是可以相互转换的。空间域滤波的核心是卷积核,频域滤波的核心是构造滤波器的传递函数。有些空间域滤波器在频率域通过傅里叶变换实现会更方便、更快速。

在空间滤波中,除Laplacian算子之外还讨论了Sobel算子、Scharr算子,但在频域滤波中却很少提及。这是因为空间滤波中的平滑(模糊)/锐化的概念,与频域滤波中的低通滤波/高通滤波虽然相似,也有密切联系,但在本质上却是不同的。平滑滤波相当于低通滤波,但锐化与高通滤波是不同的。

对空间滤波器核进行傅里叶变换,得到空间滤波器在频域的传递函数,可以清晰和直观地理解二者的联系和区别。


2. 梯度算子在空间域的卷积核

2.1 拉普拉斯卷积核(Laplacian)

各向同性卷积核的响应与方向无关。最简单的各向同性导数算子(卷积核)是拉普拉斯算子(Laplace):

K1=[0101−41010],K2=[1111−81111],K3=[0−10−14−10−10],K4=[−1−1−1−18−1−1−1−1]K1= \begin{bmatrix} 0 & 1 &0\\ 1 & -4 &1\\ 0 & 1 &0\\ \end{bmatrix}, \ K2= \begin{bmatrix} 1 & 1 &1\\ 1 & -8 &1\\ 1 & 1 &1\\ \end{bmatrix}, \ K3= \begin{bmatrix} 0 & -1 &0\\ -1 & 4 &-1\\ 0 & -1 &0\\ \end{bmatrix}, \ K4= \begin{bmatrix} -1 & -1 &-1\\ -1 & 8 &-1\\ -1 & -1 &-1\\ \end{bmatrix} K1=010141010, K2=111181111, K3=010141010, K4=111181111


2.2 Sobel 梯度算子

Sobel 算子是一种离散的微分算子,是高斯平滑和微分求导的联合运算,抗噪声能力强。

Sobel 梯度算子利用局部差分寻找边缘,计算得到梯度的近似值。

Sobel 梯度算子的卷积核为:
Kx=[−101−202−101],Ky=[−1−2−1000121]K_x = \begin{bmatrix} -1 & 0 &1\\ -2 & 0 &2\\ -1 & 0 &1\\ \end{bmatrix}, \ K_y = \begin{bmatrix} -1 &-2 &-1\\ 0 &0 &0\\ 1 &2 &1\\ \end{bmatrix} Kx=121000121, Ky=101202101


2.3 Scharr 梯度算子

Scharr 算子是 Soble 算子在 ksize=3 时的优化,与 Soble 的速度相同,且精度更高。Scharr 算子与 Sobel 算子的不同点是在平滑部分,其中心元素占的权重更重,相当于使用较小标准差的高斯函数,也就是更瘦高的模板。

Scharr 算子的卷积核为:
Gx=[−303−10010−303],Gy=[−310−300103103]G_x = \begin{bmatrix} -3 & 0 &3\\ -10 & 0 &10\\ -3 & 0 &3\\ \end{bmatrix}, \ G_y = \begin{bmatrix} -3 &10 &-3\\ 0 &0 &10\\ 3 &10 &3\\ \end{bmatrix} Gx=31030003103, Gy=303100103103


3. 【例程】梯度算子的传递函数

本例程给出由空间滤波器核计算频域传递函数的子程序,比较常用空间域滤波器和梯度算子的传递函数。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltdef getTransferFun(kernel, r):  # 计算滤波器核的传递函数hPad, wPad = r-kernel.shape[0]//2, r-kernel.shape[1]//2kernPadded = cv.copyMakeBorder(kernel, hPad, hPad, wPad, wPad, cv.BORDER_CONSTANT)kernFFT = np.fft.fft2(kernPadded)fftShift = np.fft.fftshift(kernFFT)kernTrans = np.log(1 + np.abs(fftShift))transNorm = np.uint8(cv.normalize(kernTrans, None, 0, 255, cv.NORM_MINMAX))return transNormif __name__ == '__main__':radius = 64plt.figure(figsize=(9, 5.5))# (1) 盒式滤波器plt.subplot(241), plt.axis('off'), plt.title("1. BoxFilter")kernBox = np.ones((5,5), np.float32)  # BoxF 滤波器核HBox = getTransferFun(kernBox, radius)  # BoxF 传递函数plt.imshow(HBox, cmap='gray', vmin=0, vmax=255)# (2) 高斯低通滤波器plt.subplot(242), plt.axis('off'), plt.title("2. Gaussian")kernX = cv.getGaussianKernel(5, 0)  # 一维高斯核kernGaussian = kernX * kernX.T  # 二维高斯核HGaussian = getTransferFun(kernGaussian, radius)  # 高斯低通传递函数plt.imshow(HGaussian, cmap='gray', vmin=0, vmax=255)# (3) 拉普拉斯算子 K1plt.subplot(243), plt.axis('off'), plt.title("3. Laplacian K1")kernLaplacian1 = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])  # Laplacian K1hLaplacian1 = getTransferFun(kernLaplacian1, radius)  # Laplacian K1 传递函数plt.imshow(hLaplacian1, cmap='gray', vmin=0, vmax=255)# (4) 拉普拉斯算子 K2plt.subplot(244), plt.axis('off'), plt.title("4. Laplacian K2")kernLaplacian2 = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])  # Laplacian K2hLaplacian2 = getTransferFun(kernLaplacian2, radius)  # Laplacian K2 传递函数plt.imshow(hLaplacian2, cmap='gray', vmin=0, vmax=255)# (5) Sobel 算子,X轴方向plt.subplot(245), plt.axis('off'), plt.title("5. Sobel-X")kernSobelX = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])HSobelX = getTransferFun(kernSobelX, radius)  # Sobel-X 传递函数plt.imshow(HSobelX, cmap='gray', vmin=0, vmax=255)# (6) Sobel 算子,Y轴方向plt.subplot(246), plt.axis('off'), plt.title("6. Sobel-Y")kernSobelY = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])HSobelY = getTransferFun(kernSobelY, radius)  # Sobel-Y 传递函数plt.imshow(HSobelY, cmap='gray', vmin=0, vmax=255)# (7) Scharr 算子,X轴方向plt.subplot(247), plt.axis('off'), plt.title("7. Scharr-X")kernScharrX = np.array([[-3, 0, 3], [-10, 0, 10], [-3, 0, 3]])HScharrX = getTransferFun(kernScharrX, radius)  # Scharr-X 传递函数plt.imshow(HScharrX, cmap='gray', vmin=0, vmax=255)# (8) Scharr 算子,Y轴方向plt.subplot(248), plt.axis('off'), plt.title("8. Scharr-Y")kernScharrY = np.array([[-3, -10, -3], [0, 0, 0], [3, 10, 3]])HScharrY = getTransferFun(kernScharrY, radius)  # Scharr-X 传递函数plt.imshow(HScharrY, cmap='gray', vmin=0, vmax=255)plt.tight_layout()plt.show()

![在这里插入图片描述](https://img-blog.csdnimg.cn/246290f557a240b3a7d2adb694c302d6.png#pic_center)

在这里插入图片描述

【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/127751487)
Copyright 2022 youcans, XUPT
Crated:2022-11-08

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS贪吃蛇

Js实现贪吃蛇小游戏。 程序解析&#xff1a; 画表格&#xff0c;画出相对应大小的表格速度的快慢调节随机生成事物的位置使用键盘的方向键控制移动位置当贪吃蛇碰到四周游戏结束&#xff0c;弹框显示效果演示 代码演示 html内容 <!DOCTYPE html> <html><he…

没有bug队——加贝——Python 练习实例 3,4

3.题目&#xff1a; 一个整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问该数是多少&#xff1f; 程序分析&#xff1a; 假设该数为 x。 1、则&#xff1a;x 100 n2, x 100 168 m2 2、计算等式&#xff1a;m2 …

lcd4linux 1602,详解一种LCD1602 的4线接法

描述虽然LCD1602的显示屏幕与显示字符都较小&#xff0c;实用性并不强&#xff0c;但是在一般的教学实验中&#xff0c;它仍不失为一个常用的输出显示设备。LCD1602与单片机连接的线路共有11条&#xff0c;其中有8条数据线&#xff0c;3条控制线。如果把它们都连接上&#xff0…

没有bug队——加贝——Python 练习实例 5,6

目录 5.题目&#xff1a; 6.题目&#xff1a; 5.题目&#xff1a; 输入三个整数x,y,z&#xff0c;请把这三个数由小到大输出。 程序分析&#xff1a;我们想办法把最小的数放到x上&#xff0c;先将x与y进行比较&#xff0c;如果x>y则将x与y的值进行交换&#xff0c;然后再…

MATLAB教程(1) MATLAB 基础知识(1)

第一部分&#xff1a;MATLAB显示桌面的基本布局 桌面基础知识- MATLAB & Simulink- MathWorks 中国 1.启动MATLAB后&#xff0c;桌面会显示默认布局&#xff0c;主要有以下三个部分&#xff1a; 当前文件夹命令行窗口工作空间 2.在MATLAB中一般需要创建变量和调用函数。…

【OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域(MSER)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域&#xff08;MSER&#xff09; 1. 最大稳定极值区域&#xff08;MSER&#xff09; 最大稳定极值区域&#xff08;MSER-Maximally Stable Extremal Regions&#xf…

电脑蹦迪

如何建立一个小程序让你的电脑蹦迪的呢&#xff1f; 效果演示 1.首先在桌面新建一个记事本 2.在里面添加如下代码 color 1A echo 电脑color 1B echo 电脑color 1C echo 电脑color 1D echo 电脑echo %0 3.保存记事本文件 4.修改后对名为.bat之后点击运行即可。

MATLAB教程(1) MATLAB 基础知识(2)

第三部分&#xff1a;数组的索引 数组索引- MATLAB & Simulink- MathWorks 中国 MATLAB中的每一个变量都是可以存储多个值的数组。如果想要使用数组中的某一个值&#xff0c;则需要用到索引。 1.单个元素的索引 从一个数组中索引某个元素一般有两种方法&#xff1a; 第…

没有bug队——加贝——Python 练习实例 7,8

7.题目&#xff1a; 将一个列表的数据复制到另一个列表中。 程序分析&#xff1a;使用列表[:]。 注&#xff1a;[:] 表示索引全部&#xff1b;[1:]表示从索引1到最后&#xff1b;[:2]表示从第一个索引到索引2前一个 a [1, 2, 3] b1 a[:] b2 a[1:] b3 a[:2] print (b1) …

云动画文字

用Js技术实现云动画文字。 效果演示 代码展示 html内容 <!doctype html> <html><head><meta charset"utf-8"><title></title><style>body {background-color:#000000;color:#555555; } h4 {font-family:sans-serif;co…

爬虫之祖urlib 简易教程

目录 一、前言框架 二、网址请求 2.1 打开网址 2.2 超时设置 2.3 错误抓取 三、更深请求 3.1 打开网址 3.2 请求头添加 3.3 链接解析 四、Robots 协议 五.万能视频下载 小彩蛋 一、前言框架 我们来学一下爬虫之祖urlib&#xff0c;不管你什么模块都是起源于该模块。…

【youcans 的 OpenCV 学习课】12. 彩色图像的处理

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】12.彩色图像的处理 文章目录【youcans 的 OpenCV 学习课】12.彩色图像的处理1. 图像的颜色空间转换图像的色彩空间基础图像的颜色空…

炫酷线条背景动画

使用H5的Canvas实现网页的炫酷线条背景特效。 效果演示 代码展示 html内容 <!DOCTYPE html> <html > <head> <meta charset"UTF-8"> <title></title><style> canvas{position:absolute;top:0;left:0;background-colo…

MATLAB教程(1) MATLAB 基础知识(3)

第五部分&#xff1a;文本和字符 文本和字符- MATLAB & Simulink- MathWorks 中国 在处理文本时&#xff0c;将其中的字符序列用单引号括起来&#xff0c;可以将文本分配给变量。 例如&#xff1a;myText Hello, world如果文本本身包括一个单引号&#xff0c;则在定义时…

没有bug队——加贝——Python 练习实例 9,10

9.题目&#xff1a; 暂停一秒输出。 程序分析&#xff1a;使用 time 模块的 sleep() 函数。 注&#xff1a;dict.items表示取出字典中的值 代码&#xff1a; #9 import timemyD {1: a, 2: b} for key, value in dict.items(myD):print (key, value)time.sleep(1) # 暂停 …

Spring Boot Data JPA

Spring Data JPA简介 用来简化创建 JPA 数据访问层和跨存储的持久层功能。 Spring Data JPA提供的接口 Repository&#xff1a;最顶层的接口&#xff0c;是一个空的接口&#xff0c;目的是为了统一所有Repository的类型&#xff0c;且能让组件扫描的时候自动识别。 CrudRep…

MATLAB教程(1) MATLAB 基础知识(4)

第七部分&#xff1a;二、三维图 二维图和三维图- MATLAB & Simulink- MathWorks 中国 折线图 &#xff08;1&#xff09; 画图 x 0:pi/1000:2*pi; y sin(x); plot(x,y) 这里x就用到了前面说到的索引。x表示0到2*pi之间步长为pi/100的值。 二维图如下&#xff1a; 这里…

现在能不能升级鸿蒙,能不能升级鸿蒙系统?

电梯直达huafen185613402初窥门径发表于 2021-2-28 14:28:33来自&#xff1a;华为Mate 10 Pro最新回复 2021-2-28 17:34:28这个手机现在性能还非常好呀&#xff0c;期待能够给予鸿蒙系统升级产品型号BLA-AL00出现频率总是问题类型其他应用名称Android 系统应用版本10系统版本BL…

Spring Boot MyBatis

MyBatis简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache 迁移到了google code&#xff0c;并且改名为MyBatis 。 集成spring boot 的时候必须在mapper接口上面标注Mapper注解 项目图片 pom.xml 只需要在pom.xml引入需要的数据库配置&#xff0c;就会…

没有bug队——加贝——Python 练习实例 11,12

11.题目&#xff1a; 古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 程序分析&#xff1a;兔子的规律为…