这种滤波方法就是取一个像素的邻域内各像素的平均值作为滤波结果
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('1.jpg')
plt.imshow(img)
img_mean = cv2.blur(img, (11,11))
plt.imshow(img_mean)
高斯滤波采取邻域内越靠近的值提供越大的权重的方式计算平均值。权重的选取采用高斯函数的形式。高斯函数有个非常好的特点,就是无论在时域还是频域都是钟形的。
img_guass = cv2.GaussianBlur(img, (11,11), 2, 1) #
plt.imshow(img_guass)
中值滤波是一种非线性滤波器。它是取邻域内各点的统计中值作为输出。这种滤波器可以有效的去除椒盐噪声。还能保持图像中各物体的边界不被模糊掉。是一种最常用的非线性滤波器。这种滤波器只能使用正方形的邻域。
img_mid = cv2.medianBlur(img, 11)
plt.imshow(img_mid)
高通和低通滤波器都有一个半径属性,确定了多大面积的邻近像素参与滤波运算
高通锐化,低通模糊
这里使用filter2D来和自定义的滤波器核来实现。
# 高通滤波核
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).
# 低通滤波核
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).
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")