传统计算机视觉之均值滤波初探

本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里

在前面几节,从最基础的像素开始了介绍,并且着重介绍了RGB图片和YUV图片以及通道的概念。

其实这几节的内容,很多细节和知识暂时不用都学会。你只需要知道计算机在处理图片时,计算机看到的都是一堆像素,而这一堆像素,都是以数值的形式存放在计算机中的。

为了更好的展示彩色图像,并且处理图像数据,人们为图像设置了几个通道,比如 RGB 通道。

了解这些基本就可以了,从本节开始介绍一些传统计算机视觉的知识,方便为后面学习基于深度学习的计算机视觉提供知识积累。

在传统计算机视觉中,有一类非常基础的算法,就是对图像进行滤波操作。

什么是滤波?

估计在很多场合你或多或少都听说过滤波的概念。

图像滤波是图像处理中最常见的一种操作,它的主要目的是改变图像中的某些特征,比如去除图像中的噪声。

滤波操作的是通过一定的数学算法来完成的,最常见的滤波方式包括均值滤波、中值滤波和高斯滤波。

从名字就可以看出,均值滤波是取一些像素值的平均值作为滤波的输出,中值滤波便是取一些像素的中值作为滤波后的输出。

高斯滤波就稍微复杂一些,人们特意设计了一个符合高斯分布的滤波器,完成对图像像素的高斯滤波运算。

以均值滤波为例,它是取图像中的哪些像素值来计算平均值呢?

为了清楚的表示取哪些像素值,人们设计了一个窗口,称为滤波器的窗口,在AI算法的卷积算法中,这个窗口也可以看做是卷积的卷积核。

(均值滤波示意图,灰色阴影即为窗口)

如上图,均值滤波的运算过程,是每次取灰色阴影中像素的平均值作为输出,然后将窗口往右滑动继续计算下一个窗口,直至全部计算完成。

均值滤波的作用

均值滤波既然是取了窗口内的均值,显而易见它的作用主要有:平滑图像和去除噪点(这是因为一般噪点的像素值和正常像素比会发生突变,要么突然变得很大,要么突然变得很小)。

一取均值的话,噪声点突变的像素值就被平均了,输出就会显得没那么明显了,图片的平滑效果就会好很多。因此,对于图像中存在畸变噪点的图像,采用均值滤波会有一定的效果。

上图左侧是原图,中间是增加了一些黑色的噪声点,最右侧是对中间含有噪声点的图像做了一次均值滤波。

可以看到,均值滤波之后,噪声点没有那么明显了。

你可以通过调整均值滤波的窗口大小,来获取更好的滤波效果。一般而言,窗口设置的越大,输出图像平滑的越厉害,可能也越模糊,所以需要根据实际需要选择合适的窗口大小。

实现上述滤波的源代码在下方,你可以在这个目录下获取源代码和原始图像来体验滤波的过程。

ini 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('panda.png')

# 添加椒盐噪声
def add_salt_and_pepper_noise(image, salt_prob, pepper_prob):
    noisy_image = image.copy()
    total_pixels = image.size
    
    # 添加椒盐噪声
    num_salt = np.ceil(salt_prob * total_pixels)
    salt_coords = [np.random.randint(0, i-1, int(num_salt)) for i in image.shape]
    noisy_image[salt_coords[0], salt_coords[1], :] = 255
    
    num_pepper = np.ceil(pepper_prob * total_pixels)
    pepper_coords = [np.random.randint(0, i-1, int(num_pepper)) for i in image.shape]
    noisy_image[pepper_coords[0], pepper_coords[1], :] = 0
    
    return noisy_image

# 生成椒盐噪声
salt_and_pepper_image = add_salt_and_pepper_noise(image, salt_prob=0.02, pepper_prob=0.02)

# 定义均值滤波器的大小
kernel_size = (8, 8)

# 应用均值滤波
filtered_image = cv2.blur(salt_and_pepper_image, kernel_size)

# 使用Matplotlib显示原始图像、椒盐噪声图像和滤波后的图像
fig, axes = plt.subplots(1, 3, figsize=(15, 5))

axes[0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
axes[0].set_title('Original Image')
axes[0].axis('off')

axes[1].imshow(cv2.cvtColor(salt_and_pepper_image, cv2.COLOR_BGR2RGB))
axes[1].set_title('Image with Salt and Pepper Noise')
axes[1].axis('off')

axes[2].imshow(cv2.cvtColor(filtered_image, cv2.COLOR_BGR2RGB))
axes[2].set_title('Filtered Image')
axes[2].axis('off')

plt.show()

如果你想学习 AI ,欢迎来添加我的微信 (vx: ddcsggcs ),会有很多好玩的AI技术分享,可以咨询、也可以围观朋友圈呀!欢迎查看我的专栏 >>1. 专栏:计算机视觉入门与调优 , 2. 专栏:Transformer 通关与大模型实战

相关推荐
Wils0nEdwards30 分钟前
Leetcode 从中序与后序遍历序列构造二叉树
算法·leetcode·职场和发展
Channing Lewis44 分钟前
聚类的主要算法和介绍
算法·机器学习·聚类
南宫生1 小时前
力扣-数据结构-8【算法学习day.79】
java·数据结构·学习·算法·leetcode
硬禾科技1 小时前
FPGA、STM32、ESP32、RP2040等5大板卡,结合AI,更突出模拟+数字+控制+算法
人工智能·stm32·算法·ai·fpga开发
凭君语未可1 小时前
常见编程语言的字符串拼接函数
算法
计算机学长大白1 小时前
C中如何生成随机数并用于编程?
c语言·算法
挂机加载中2 小时前
7-58 输出不重复的数组元素
数据结构·算法
ゞ 正在缓冲99%…2 小时前
leecode322.零钱兑换
数据结构·算法·leetcode
Evand J2 小时前
《MATLAB创新性滤波算法》专栏目录,持续更新中……
开发语言·算法·matlab
爱学习的橙子羊2 小时前
118.杨辉三角&120.三角形最小路径和
算法