常见的电子商务网站有哪些,海南新政策最新,网站模板设计,做推广网站有什么『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】250. 梯度算子的传递函数 1. 空间卷积与频域滤波
空间域图像滤波是图像与滤波器核的卷积#xff0c;而空间卷积的傅里叶变换是频率域中相应变换的乘积#xff0c;因此频率域图像滤波是频率域滤波器… 『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】250. 梯度算子的传递函数 1. 空间卷积与频域滤波
空间域图像滤波是图像与滤波器核的卷积而空间卷积的傅里叶变换是频率域中相应变换的乘积因此频率域图像滤波是频率域滤波器传递函数与图像的傅里叶变换相乘。频率域中的滤波概念更加直观滤波器设计也更容易。
对于二维图像处理通常使用 x,yx, yx,y 表示离散的空间域坐标变量用 u,vu,vu,v 表示离散的频率域变量。二维离散傅里叶变换DFT和反变换IDFT为
F(u,v)∑x0M−1∑y0N−1f(x,y)e−j2π(ux/Mvy/N)f(x,y)1MN∑u0M−1∑v0N−1F(u,v)ej2π(ux/Mvy/N)\begin{aligned} F(u,v) \sum_{x0}^{M-1} \sum_{y0}^{N-1} f(x,y) e^{-j 2\pi (ux/Mvy/N)}\\ f(x,y) \frac{1}{MN} \sum_{u0}^{M-1} \sum_{v0}^{N-1} F(u,v) e^{j 2\pi (ux/Mvy/N)} \end{aligned} F(u,v)f(x,y)x0∑M−1y0∑N−1f(x,y)e−j2π(ux/Mvy/N)MN1u0∑M−1v0∑N−1F(u,v)ej2π(ux/Mvy/N)
空间取样和频率间隔是相互对应的频率域所对应的离散变量间的间隔为Δu1/MΔTΔv1/NΔZ\Delta u 1/M \Delta T\Delta v 1/N \Delta ZΔu1/MΔTΔv1/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⎣⎡0101−41010⎦⎤, K2⎣⎡1111−81111⎦⎤, K3⎣⎡0−10−14−10−10⎦⎤, K4⎣⎡−1−1−1−18−1−1−1−1⎦⎤ 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⎣⎡−1−2−1000121⎦⎤, Ky⎣⎡−101−202−101⎦⎤ 2.3 Scharr 梯度算子
Scharr 算子是 Soble 算子在 ksize3 时的优化与 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⎣⎡−3−10−30003103⎦⎤, Gy⎣⎡−30310010−3103⎦⎤ 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, cmapgray, vmin0, vmax255)# (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, cmapgray, vmin0, vmax255)# (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, cmapgray, vmin0, vmax255)# (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, cmapgray, vmin0, vmax255)# (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, cmapgray, vmin0, vmax255)# (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, cmapgray, vmin0, vmax255)# (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, cmapgray, vmin0, vmax255)# (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, cmapgray, vmin0, vmax255)plt.tight_layout()plt.show()  【本节完】 版权声明 youcansxupt 原创作品转载必须标注原文链接(https://blog.csdn.net/youcans/article/details/127751487) Copyright 2022 youcans, XUPT Crated2022-11-08