OpenCV实现中值滤波器代码示例
需积分: 10 81 浏览量
更新于2024-09-10
收藏 2KB TXT 举报
"本文主要介绍OpenCV库中的中值滤波函数,以及如何在C++中实现这一功能。通过示例代码,我们将了解如何对图像进行中值滤波操作,以去除噪声并平滑图像。"
在计算机视觉领域,OpenCV是一个广泛使用的开源库,它提供了大量的图像处理和计算机视觉功能。中值滤波是一种非线性的滤波方法,常用于去除图像中的椒盐噪声或斑点噪声。与传统的均值滤波不同,中值滤波不会被强烈的噪声点所影响,因为它不计算像素的平均值,而是取像素邻域内的中值作为新的像素值。
在OpenCV中,虽然已经内置了`medianBlur()`函数来执行中值滤波,但为了理解其工作原理,我们可以自己编写一个简单的中值滤波器。以下是一个名为`medianFilter()`的自定义函数,它接受一个输入图像(`corrupted`)和一个输出图像(`smooth`),并使用3x3的窗口进行中值滤波:
```cpp
void medianFilter(Mat corrupted, Mat& smooth) {
int width = corrupted.cols;
int height = corrupted.rows;
corrupted.copyTo(smooth); // 将输入图像复制到输出图像
// 对图像进行遍历
for (int j = 1; j < height - 2; j++) {
for (int i = 1; i < width - 2; i++) {
int k = 0;
unsigned char window[9];
// 填充3x3窗口内的像素值
for (int jj = j - 1; jj < j + 2; ++jj) {
for (int ii = i - 1; ii < i + 2; ++ii) {
window[k++] = corrupted.at<uchar>(jj, ii); // 获取像素值
}
}
// 对窗口内的元素进行排序
for (int m = 0; m < 5; ++m) {
int min = m;
for (int n = m + 1; n < 9; ++n) {
if (window[n] < window[min]) {
min = n;
}
}
// 将找到的最小元素放到正确的位置
unsigned char temp = window[m];
window[m] = window[min];
window[min] = temp;
}
// 将排序后窗口的中间值赋给输出图像
smooth.at<uchar>(j, i) = window[4];
}
}
}
```
在主函数`main()`中,我们可以读取一张图像,并调用`medianFilter()`函数进行滤波操作:
```cpp
int main(int argc, _TCHAR* argv[]) {
Mat src = imread("F:\\图片\\原始图像.jpg"); // 读取图像
if (src.empty()) {
printf("无法打开图像文件\n");
return -1;
}
Mat dst;
medianFilter(src, dst); // 执行中值滤波
namedWindow("原始图像", WINDOW_NORMAL);
imshow("原始图像", src);
namedWindow("中值滤波结果", WINDOW_NORMAL);
imshow("中值滤波结果", dst);
waitKey();
return 0;
}
```
这段代码首先加载图像,然后调用自定义的中值滤波函数,最后显示原图和滤波后的图像。通过这种方式,我们可以直观地看到中值滤波在去除图像噪声方面的作用。
总结来说,OpenCV中的中值滤波是一种有效的噪声去除技术,特别是在处理椒盐噪声时效果显著。通过自定义函数实现,我们可以更好地理解其内部工作流程,同时也可以根据实际需求进行定制化处理。在实际应用中,结合OpenCV提供的`medianBlur()`函数,可以更方便地进行图像预处理,提高后续图像分析和处理的准确性。
2016-10-09 上传
2018-11-21 上传
2019-03-05 上传
2013-08-21 上传
2023-11-02 上传
2023-10-20 上传
2023-09-04 上传
2024-03-30 上传
2023-08-27 上传
yangleisuannai
- 粉丝: 0
- 资源: 1
最新资源
- NIST REFPROP问题反馈与解决方案存储库
- 掌握LeetCode习题的系统开源答案
- ctop:实现汉字按首字母拼音分类排序的PHP工具
- 微信小程序课程学习——投资融资类产品说明
- Matlab犯罪模拟器开发:探索《当蛮力失败》犯罪惩罚模型
- Java网上招聘系统实战项目源码及部署教程
- OneSky APIPHP5库:PHP5.1及以上版本的API集成
- 实时监控MySQL导入进度的bash脚本技巧
- 使用MATLAB开发交流电压脉冲生成控制系统
- ESP32安全OTA更新:原生API与WebSocket加密传输
- Sonic-Sharp: 基于《刺猬索尼克》的开源C#游戏引擎
- Java文章发布系统源码及部署教程
- CQUPT Python课程代码资源完整分享
- 易语言实现获取目录尺寸的Scripting.FileSystemObject对象方法
- Excel宾果卡生成器:自定义和打印多张卡片
- 使用HALCON实现图像二维码自动读取与解码