数字图像处理——空间滤波

本文介绍了空间滤波的基本原理,包括算术均值滤波、中值滤波、拉普拉斯滤波以及一阶微分锐化(Sobel算子)。算术均值滤波适用于高斯噪声去除,但可能导致图像边缘模糊;中值滤波擅长处理椒盐噪声;拉普拉斯滤波用于边缘检测,但会增强噪声;非锐化遮掩和高提升滤波则通过原图与平滑图像的差值得到锐化效果。Sobel算子利用一阶微分进行边缘检测,相比二阶微分,噪声增强较小。

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

空间滤波原理

图像的滤波分为频率滤波和空间滤波,顾名思义频率滤波是在频率上进行相应的操作,而空间滤波是在空域上对像素的邻域进行一系列的操作以达到相应的效果的方法。空滤滤波在图像边界上回存在邻域像素不足的情况,而本文的解决方案是用零来填充,当然你也可以用其它合适的方法来解决这一问题。

算术均值滤波

算术均值滤波算是一种比较简单的滤波,它的做法是对图像像素点的邻域进行进行求和取均值。这种做法可以滤除图像细小细节,包含噪声(算是图像的细节部分),根据滤波模板的大小可决定滤波细节的大小,但同时会使图像的的边缘模糊。此滤波方法可用于高斯噪声的滤波,因为高斯噪声的均值是零(补充:高斯滤波对高斯噪声处理的效果更好, 原因:增大了中心像素的权重系数,计算结果更接近原图像像素值,保持图像不会过于模糊)。对于一些特征提取操作,使用模糊图像效果更好,因为细节部分更少,大部分融入了背景,使得网络更加容易训练。

参考代码

#include<iostream>
#include<string>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void test1();
Mat arithmeticMeanFilter(Mat &src, int size);
void test2();
cv::Mat addSaltNoise(const cv::Mat &src, int n, int op);
Mat middleFilter(Mat &src, int size);
double findNumber(double* num, int start, int end, int n);
void test3();
Mat laplasFilter(Mat &src, bool standard, bool sharpen);
double standardImageSingleArray(Mat &src, double* num, int rank);
uchar pixesDeal(double n);
Mat standardImageSingle(Mat &src, int rank);
Mat addImage(Mat &src1, Mat &src2, double rate1, double rate2, double zero, bool standard);
void test4();
void test5();
Mat sobelFilter(Mat &src);


int main()
{
   
   
	test1();
	test2();
	test3();
	test4();
	test5();
	return 0;
}

// 测试一
void test1()
{
   
   
	// 获取彩色图像
	Mat src = imread("D:/ali.png", 1);
	Mat dst = arithmeticMeanFilter(src, 5);
	// 显示
	imshow("原图", src);
	imshow("算术均值滤波", dst);
	waitKey(0);
	destroyAllWindows();
}


// 算术均值滤波
Mat arithmeticMeanFilter(Mat &src, int size)
{
   
   
	if (src.channels() == 3)
	{
   
   
		vector<Mat> bgr;
		// 通道分离
		split(src, bgr);
		// 通道遍历
		for (int i = 0; i < 3; i++)
			// 算术均值滤波
			bgr[i] = arithmeticMeanFilter(bgr[i], size);
		// 通道合并
		Mat dst;
		merge(bgr, dst);
		return dst;
	}
	// 深拷贝
	Mat dst = src.clone();
	double sum;
	// 遍历像素
	for (int i = 0; i < src.rows; i++)
		for (int j = 0; j < src.cols; j++)
		{
   
   
			// 初始化
			sum = 0;
			// 遍历模板
			for (int n = -size/2; n <= size/2; n++)
				for (int m = -size/2; m <= size/2; m++)
				{
   
   
					// 边缘补零
					if (i + n < 0 || j + m < 0 || i + n >= src.rows || j + m >= src.cols)
						sum += 0;
					else
						sum += dst.at<uchar>(i + n, j + m);
				}
			dst.at<uchar>(i, j) = saturate_cast<int>(sum / (size*size));
		}
	return dst;
}

效果图与应用场景

从图中可明显感受到图像的边缘变得模糊,对于高斯噪声的去噪效果后续文章会有介绍。

中值滤波

中值滤波是根据像素点邻域的大小,取其均值代替中心点的像素值,是一种非线性滤波。中值滤波的设计是出于对椒盐噪声的处理。用均值滤波效果不太好,因为噪声的均值不等于零。而中值滤波可有效滤除图像上的极值点,对椒盐噪声的滤波效果极好。

参考代码

// 测试二
void test2()
{
   
   
	// 获取彩色图像
	Mat src = imread("D:/ali.png", 1);
	// 添加椒盐噪声
	Mat noise = addSaltNoise(src, 10000, 0);
	// 中值滤波
	Mat dst = middleFilter(noise, 3);
	// 显示
	imshow("原图", src);
	imshow("椒盐噪声图", noise);
	imshow("中值滤波", dst);
	waitKey(0);
	destroyAllWindows();
}


// 添加椒盐噪声op=0, 添加盐粒噪声op=1, 添加胡椒噪声op=2
cv::Mat addSaltNoise(const cv::Mat &src, int n, int op)
{
   
   
	cv::Mat dst = src.clone();
	if (op == 0 || op == 1)
	{
   
   
		for (int k = 0; k < n; k++)
		{
   
   
			int i = rand() % dst.rows;
			int j = rand() % dst.cols;
			// 通道判定
			if (dst.channels() == 1)
			{
   
   
				dst.at<uchar>(i, j) = 255;				// 添加盐噪声
			}
			else
			{
   
   
				dst.at<cv::Vec3b
### 数字图像处理空间滤波的原理与实现 #### 空间滤波的概念 空间图像处理主要包括灰度变换和空间滤波两种操作[^1]。其中,空间滤波通过利用像素及其邻近区域的信息来修改图像特性。它广泛应用于去噪、边缘检测和平滑等领域。 #### 空间滤波的工作机制 空间滤波的核心思想是对目标像素周围的局部区域应用一个特定的操作函数。具体而言,使用大小为 \( m \times n \) 的滤波器对一幅尺寸为 \( M \times N \) 的图像进行线性空间滤波时,滤波器响应 \( g(x, y) \) 可定义为滤波器系数与覆盖区域内相应像素值乘积的总和[^4]。这一过程可以描述如下: - 将滤波器放置于图像上的每一个像素位置; - 计算滤波器掩模内的权重与对应像素值的乘积并求和; - 把得到的结果赋予当前像素作为新的灰度值。 #### 类型及其实现方式 根据功能的不同,空间滤波可分为平滑(低通)滤波和锐化(高通)滤波两大类。 ##### 平滑滤波 平滑滤波主要用于减少图像中的高频成分,比如随机噪声或细节纹理。常见的有均值滤波器和高斯滤波器等。以下是采用Python实现的一个简单例子——均值滤波器的应用: ```python import numpy as np from scipy.ndimage import convolve def mean_filter(image, kernel_size=3): """ 应用均值滤波器到输入图像。 参数: image (numpy.ndarray): 输入二维灰度图像数组。 kernel_size (int): 滤波窗口大小,默认为3x3。 返回: filtered_image (numpy.ndarray): 经过均值滤波后的图像。 """ # 创建一个全一矩阵作为卷积核 kernel = np.ones((kernel_size, kernel_size)) / (kernel_size ** 2) # 使用convolve执行卷积操作 filtered_image = convolve(image, kernel, mode='constant', cval=0.0) return filtered_image ``` 上述代码片段展示了如何构建一个简单的均值滤波器,并将其作用于给定的图像数据上[^2]。 ##### 锐化滤波 为了突出图像边界或者增加对比度,通常会运用锐化技术。一种典型的代表就是拉普拉斯算子。其基本形式涉及二阶导数计算,在实际编程过程中可通过离散模板完成: \[ H(u,v)=\delta(u,v)-kG(u,v), k>0 \] 这里不再赘述具体的数学表达式推导过程,而是给出一段基于OpenCV库的实际编码案例供参考: ```python import cv2 import matplotlib.pyplot as plt # 加载原始图片 original_img = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE) # 定义Laplacian内核 laplacian_kernel = np.array([[0, 1, 0], [1,-4, 1], [0, 1, 0]]) # 执行卷积运算 sharpened_img = cv2.filter2D(original_img, -1, laplacian_kernel) plt.figure(figsize=(8,4)) plt.subplot(121); plt.imshow(original_img,cmap="gray"); plt.title("Original Image") plt.subplot(122); plt.imshow(sharpened_img,cmap="gray"); plt.title("Sharpened Image") plt.show() ``` 此脚本读取一张黑白照片后施加了一个标准的四方向差分逼近方案来进行增强效果展示[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值