cv2中的滤波,均值,高斯,中值,高通,低通,傅里叶变换

本文介绍了图像处理中的多种滤波技术,包括均值滤波、高斯滤波、中值滤波、高通/低通滤波及傅里叶变换等。通过具体的Python代码实现了不同滤波器的效果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

均值滤波

这种滤波方法就是取一个像素的邻域内各像素的平均值作为滤波结果

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('1.jpg')
plt.imshow(img)
<matplotlib.image.AxesImage at 0x21b6dbb1518>

在这里插入图片描述

img_mean = cv2.blur(img, (11,11))
plt.imshow(img_mean)
<matplotlib.image.AxesImage at 0x21b6d9c7518>

在这里插入图片描述

高斯滤波

高斯滤波采取邻域内越靠近的值提供越大的权重的方式计算平均值。权重的选取采用高斯函数的形式。高斯函数有个非常好的特点,就是无论在时域还是频域都是钟形的。

img_guass = cv2.GaussianBlur(img, (11,11), 2, 1) # 
plt.imshow(img_guass)
<matplotlib.image.AxesImage at 0x21b6dc121d0>

在这里插入图片描述

中值滤波

中值滤波是一种非线性滤波器。它是取邻域内各点的统计中值作为输出。这种滤波器可以有效的去除椒盐噪声。还能保持图像中各物体的边界不被模糊掉。是一种最常用的非线性滤波器。这种滤波器只能使用正方形的邻域。

img_mid = cv2.medianBlur(img, 11)
plt.imshow(img_mid)
<matplotlib.image.AxesImage at 0x21b6fe15400>

在这里插入图片描述

高通滤波/低通滤波

高通和低通滤波器都有一个半径属性,确定了多大面积的邻近像素参与滤波运算

高通锐化,低通模糊

这里使用filter2D来和自定义的滤波器核来实现。

  • 另外,还有可分离滤波器 sepFilter2D,用于实现对x,y方向上的分别滤波
# 高通滤波核
import numpy as np
kernel_3x3 = np.array([[-1/9, -1/9, -1/9],
                       [-1/9, 8/2, -1/9],
                       [-1/9, -1/9, -1/9]])

kernel_5x5 = np.array([[-1, -1, -1, -1, -1],
                       [-1, 1, 2, 2, -1],
                       [-1, 2, 4, 2, -1],
                       [-1, 1, 2, 1, -1],
                       [-1, -1, -1, -1, -1]])

img_high = cv2.filter2D(img, 3, kernel_3x3) # 
plt.imshow(img_high)
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).





<matplotlib.image.AxesImage at 0x21b78442f28>

在这里插入图片描述

  • 效果不好可以改变滤波核就可以
# 低通滤波核
kernel_3x3 = np.array([[2, 2, 2],
                       [2, 0, 2],
                       [2, 2, 2]])
img_low = cv2.filter2D(img, 3, kernel_3x3) # 
plt.imshow(img_low)
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).





<matplotlib.image.AxesImage at 0x21b794d3550>

在这里插入图片描述

傅里叶变换

img_gray = cv2.imread("1.jpg", 0)
dft = cv2.dft(np.float32(img_gray), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
def magnitude(x, y):
    x_m = x * x
    y_m = y * y
    z_m = x_m + y_m
    return np.sqrt(z_m)
magnitude_spectrum2 = 20 * np.log10(magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
plt.imshow(magnitude_spectrum2, cmap="gray")
<matplotlib.image.AxesImage at 0x21b795c8550>

在这里插入图片描述


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值