6.3中值滤波

目录

实验原理

示例代码1

运行结果1

示例代码2

运行结果2


实验原理

中值滤波(Median Filtering)是一种非线性滤波技术,常用于图像处理中去除噪声,特别是在保留边缘的同时减少椒盐噪声(salt-and-pepper noise)。OpenCV中的cv::medianBlur函数可以实现中值滤波。

函数原型

void medianBlur( InputArray src, OutputArray dst, int ksize );

参数说明
•src:输入图像。
•dst:输出图像,与输入图像具有相同的大小和类型。
•ksize:卷积核大小,通常是一个奇数,如3、5、7等。

工作原理
中值滤波器的工作方式是通过一个窗口即卷积核(Kernel)(通常为奇数大小,比如3×3, 5×5等)在图像上滑动,对该像素点及其邻域内的窗口内的所有像素值进行排序,然后用中位数来代替窗口中心的像素值。这样做的好处是不会像简单的平均滤波那样模糊边缘,因为中值滤波能够有效地抑制孤立的噪声点,而对图像的整体结构影响较小。

优点

1. 去噪能力强:特别适合去除椒盐噪声

2. 边缘保持:由于中值滤波是非线性滤波,它在平滑图像的同时能较好地保持图像的边缘。

不足

1. 计算复杂度较高:相对于线性滤波器(如均值滤波或高斯滤波),中值滤波涉及排序操作,因此计算量较大。

2. 不适合去除高斯噪声:对于高斯噪声,高斯滤波可能更为合适。

示例代码1

#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char** argv)
{
    if (argc != 2)
    {
        std::cout << "Usage: " << argv[0] << " <image_path>" << std::endl;
        return -1;
    }

    // 读取图像
    cv::Mat src = cv::imread(argv[1], cv::IMREAD_COLOR);
    if (src.empty())
    {
        std::cout << "Error opening image" << std::endl;
        return -1;
    }

    // 创建输出图像
    cv::Mat dst;

    // 定义卷积核大小
    int kernelSize = 5; // 卷积核大小,必须是奇数

    // 应用中值滤波
    cv::medianBlur(src, dst, kernelSize);

    // 显示结果
    cv::namedWindow("Original Image", cv::WINDOW_NORMAL);
    cv::imshow("Original Image", src);

    cv::namedWindow("Median Blurred Image", cv::WINDOW_NORMAL);
    cv::imshow("Median Blurred Image", dst);

    cv::waitKey(0);

    return 0;
}
代码解释
1. 读取图像:使用cv::imread读取输入图像,并确保它是彩色图像。
2. 创建输出图像:创建一个新的cv::Mat对象来存储模糊后的结果。
3. 定义卷积核大小:定义一个奇数大小的卷积核,如5x5。
4. 应用中值滤波:使用cv::medianBlur函数对图像进行中值滤波。
5. 显示结果:使用cv::imshow函数显示原始图像和中值模糊后的图像,并等待用户按键退出。

运行结果1

​​​​​​​

核大小的选择

卷积核的大小(ksize)决定了滤波器的效果。较大的核可以产生更强烈的平滑效果,但可能会丢失更多的细节;较小的核则可以保留更多细节,但平滑效果较弱。通常情况下,ksize应该是一个奇数,以确保卷积核覆盖中心像素点。

总结

中值滤波是一种有效的图像去噪技术,尤其适用于去除椒盐噪声。通过使用cv::medianBlur函数,可以轻松地在OpenCV中实现中值滤波。选择合适的卷积核大小可以控制滤波器的效果,较大的核可以产生更强烈的平滑效果,但可能会丢失更多的细节;较小的核则可以保留更多细节,但平滑效果较弱。

示例代码2

// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 

using namespace cv;
int main()
{
	// 载入原图
	Mat image = imread("03.png");
	//创建窗口
	namedWindow("中值滤波【原图】",WINDOW_NORMAL);
	namedWindow("中值滤波【效果图】", WINDOW_NORMAL);
	//显示原图
	imshow("中值滤波【原图】", image);
	//进行中值滤波操作
	Mat out;
	medianBlur(image, out, 5);//输入,输出,7通道
	//显示效果图
	imshow("中值滤波【效果图】", out);
	waitKey(0);
}
 

运行结果2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值