基于opencv,C++实现中值滤波器

article/2025/8/27 13:47:45

基于opencv,C++实现中值滤波器

目的:去除图像的椒盐噪声
原理:它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值
在这里插入图片描述
伪代码:
输入:原图像、目标图像、核的半径

(1).判断原图像是否为空,空则直接返回
(2).判断核的半径是否为奇数
(3).原图像边界填充,目标图像清空
(4).中值滤波
①.新建一个半径*半径大小的二维数组
②.获取核大小的原图像的值,写入数组
③.数组进行排序
④.将中值写入目标图像

源代码

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <vector>
#include <algorithm>using namespace cv;
using namespace std;// 冒泡排序
void Sort(int* a, int n)		//把数组a递增排序
{//for (int gap = n / 2; gap > 0; gap /= 2)//希尔排序//	for (int i = gap; i < n; ++i)//		for (int j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)//			swap(a[j], a[j + gap]);for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++){if (a[i] > a[j]) {int tmp = a[i];a[i] = a[j];a[j] = tmp;}}}}// 中值滤波
void MedianFilter(cv::Mat &srcImg, cv::Mat& dstImg, int ksize)
{// 判断原图像是否为空if (srcImg.empty()) {return;}// 判断核的大小是否为奇数CV_Assert(ksize % 2 == 1);// 获取通道数int channels = srcImg.channels();// 清空目标图像,对原图像进行边界填充Mat tmp;dstImg = dstImg.zeros(srcImg.size(), srcImg.type());int *kernel = new int[ksize*ksize];copyMakeBorder(srcImg, tmp, ksize / 2, ksize / 2, ksize / 2, ksize / 2, BORDER_REPLICATE);for (int i = ksize / 2; i < srcImg.rows + ksize / 2; i++)		//对填充后的图像从有图像区域开始滤波{for (int j = ksize / 2; j < srcImg.cols + ksize / 2; j++){for (int c = 0; c < channels; c++){// 将核大小的图像填入数组for (int m = 0; m < ksize*ksize; m++) {if (tmp.channels() == 1) {kernel[m] = tmp.ptr<uchar>(i - ksize / 2 + m / ksize, j - ksize / 2 + m % ksize)[c];}else if (tmp.channels() == 3) {kernel[m] = tmp.ptr<Vec3b>(i - ksize / 2 + m / ksize, j - ksize / 2 + m % ksize)->val[c];}else{delete[]kernel;return;}}// 排序	Sort(kernel, ksize*ksize);// 将中值写入目标图像if (tmp.channels() == 1) {dstImg.ptr<uchar>(i - ksize / 2, j - ksize / 2)[c] = kernel[(ksize*ksize) / 2];}else if (tmp.channels() == 3) {dstImg.ptr<Vec3b>(i - ksize / 2, j - ksize / 2)->val[c] = kernel[(ksize*ksize) / 2];}}}}delete[]kernel;}int main() {Mat image = imread("C:/Users/vmyf16/Desktop/1.jpg");if (image.empty()) {return -1;}Mat image2, image3;double t1 = (double)cv::getTickCount()/1000;MedianFilter(image, image2,3);t1 = (double)cv::getTickCount()/1000 - t1;std::cout << "自定义:" << t1 << std::endl;double t2 = (double)cv::getTickCount()/1000;medianBlur(image, image3, 3);t2 = (double)cv::getTickCount()/1000 - t2;std::cout << "opencv:" << t2 << std::endl;imshow("原图", image);imshow("自定义中值滤波处理后", image2);imshow("openCV自带的中值滤波", image3);waitKey(0);return 0;
}

结果图
原图:在这里插入图片描述
效果图:
在这里插入图片描述
明显看出:opencv的算法还是挺快的,自己写的就当练练手。


http://chatgpt.dhexx.cn/article/fKH3ErcT.shtml

相关文章

python自编中值滤波器

使用python实现图像的中值滤波 椒盐噪声处理的图片&#xff1a; import numpy as np import matplotlib.pyplot as plt from skimage import io def mediafil(img,m): #滤波后会缺失边缘&#xff0c;先对原图进行0 paddingimg1np.zeros((img.shape[0]m-1,img.shape[1]m-1))im…

空间滤波-随机椒盐噪声-高斯噪声-均值滤波器-中值滤波器

文章目录 1 随机椒盐噪声2 高斯噪声3 均值滤波器4 中值滤波器 1 随机椒盐噪声 椒噪声&#xff1a;灰度值为0的噪声点&#xff0c;黑噪声 盐噪声&#xff1a;灰度值为255的噪声点&#xff0c;白噪声 思路&#xff1a;获取图像长、宽、通道数&#xff0c;在每个通道矩阵中随机产…

《数字图像处理》手动实现修正的α均值滤波+手动实现自适应中值滤波器

1 修正的α均值滤波实现 1.1 修正的α均值滤波原理 假设在邻域S_xy内去掉g(x,t)最低灰度值的d/2和最高的灰度值的d/2。令g_r (x,t)代表剩下的mn-d个像素。由这些剩余的像素的平均值形成的滤波器就称为修正的α均值滤波器&#xff1a; 其中&#xff0c;d的取值范围可以为0到m…

3D点云处理:半径滤波器中值滤波器

文章目录 0. 效果1. 半径滤波器1.1. 半径滤波器基本内容1.2 pcl实现2. 中值滤波器2.1.中值滤波器基本内容2.2 pcl实现3. 参考0. 效果 红色点云为处理的点云;白色为滤除的点云。 1. 半径滤波器 1.1. 半径滤波器基本内容 设置目标点半径范围内最少点数,如果少于该点数,则认为…

中值滤波器和双边滤波器(python实现)

文章目录 1.中值滤波&#xff08;1&#xff09;函数&#xff08;2&#xff09;代码 2.双边滤波&#xff08;1&#xff09;函数讲解&#xff08;2&#xff09;关于d,sigmaColor和sigmaSpace的值选择&#xff08;3&#xff09;代码实现 1.中值滤波 优点&#xff1a;对椒盐噪声处…

自适应中值滤波器(基于OpenCV实现)

转自&#xff1a;http://blog.csdn.net/brookicv/article/details/54931857 本文主要介绍了自适应的中值滤波器&#xff0c;并基于OpenCV实现了该滤波器&#xff0c;并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比。最后&#xff0c;对中…

NAFSM中值滤波器讲解与实现

去年大三时课上&#xff0c;医学图像处理老师讲解了这个算法&#xff0c;当时布置的作业就是实现这个中值滤波器&#xff0c;今天突然从一篇论文中看到过类似这种思想&#xff0c;就又想起来了&#xff0c;发现网上对这个算法的讲解很少&#xff0c;那我就在这分享一下咯&#…

中值滤波器处理椒盐噪声

clc; close all; clear all; %读取原始图像 im imread(‘Fig0318(b)(ckt-board-slt-pep-both-0pt2).tif’); im_noise_salt imnoise(im,‘salt & pepper’,0.05); % 加入椒盐噪声 % im_noise_gaussian imnoise(im,‘gaussian’); %定义邻域尺寸 n1 2; m1 2n11; n2 2;…

使用中值滤波器对图像降噪

中值滤波器&#xff1a; 基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号处理技术。中值滤波的特点即是首先确定一个以某个像素为中心点的邻域&#xff0c;一般为方形邻域&#xff0c;也可以为圆形、十字形等等&#xff0c;然后将邻域中各像素的灰度值排序&#xff…

【OpenCV 例程 300 篇】101. 自适应中值滤波器

专栏地址&#xff1a;『youcans 的 OpenCV 例程 300篇 - 总目录』 【第 7 章&#xff1a;图像复原与重建】 100. 自适应局部降噪滤波器 101. 自适应中值滤波器 102. 陷波带阻滤波器的传递函数 【youcans 的 OpenCV 例程 300 篇】101. 自适应中值滤波器 3.8 自适应中值滤波器&am…

python实现自适应中值滤波器

目录 原理&#xff08;冈萨雷斯第四版p235&#xff09;&#xff1a; 代码&#xff1a; 结果&#xff1a; 原理&#xff08;冈萨雷斯第四版p235&#xff09;&#xff1a; 代码&#xff1a; import cv2 import numpy as np from matplotlib import pyplot as plt# for gray im…

自编自适应中值滤波器

自适应中值滤波器 算法思想&#xff1a;自适应中值滤波器是根据输入的图片像素矩阵和滤波器窗口的最大和最小值&#xff0c;首先&#xff0c;根据滤波器窗口的最大值申请两个可以处理了边界情况的滤波器&#xff0c;大小为原图加上最大滤波器的尺寸减一&#xff0c;按照边缘处…

图像中值滤波器python实现

中值滤波器原理 图像处理中最著名的统计排序滤波器是中值滤波器&#xff0c;即用一个预定义的像素领域中的灰度中值来代替像素的值&#xff1a; 其中是以&#xff08;x,y&#xff09;为中心的领域&#xff0c;包含中心点自己&#xff0c;在领域中找到中值&#xff0c;并用中值…

中值滤波器 median filter

中值滤波 中值滤波器(median filter)是将每个像素替换为围绕这个像素的矩形领域内的中值&#xff0c;或”中值像素"。 通过平均的简单模糊对噪声图像&#xff0c;由其是有较大孤立的异常值非常敏感。少量具有较大偏差的点也会严重影响到均值滤波。中值滤波可以采用取中间…

中值滤波器

我们前面提到&#xff0c;使用平均操作或加权平均操作可以降低图像的噪声&#xff0c;并由此引出了空间滤波器的概念。 这种平均操作或加权平均操作的空间滤波器&#xff0c;根据平均操作的特点&#xff0c;可以叫做均值滤波器。均值&#xff0c;就是平均值得意思。我们在《统…

C Primer Plus 第1章 初识C语言 笔记

C语言的起源 1972年&#xff0c;贝尔实验室的丹尼斯里奇&#xff08;Dennis Ritch&#xff09;和肯汤普逊&#xff08;Ken Thompson&#xff09;在开发UNIX操作系统时设计了C语言。 选择C语言的理由 用C语言编写的程序更易懂、更可靠。C语言充分利用了当前计算机的优势&…

C语言 基于结构体的程序设计(PTA)

一、实验目的 1&#xff0e;掌握C语言中结构体类型的定义和结构体变量的定义和引用。 2&#xff0e;掌握用结构指针传递结构数据的方法。 二、实验内容 1、 计算职工工资 给定N个职员的信息&#xff0c;包括姓名、基本工资、浮动工资和支出&#xff0c;要求编写程序顺序输…

C语言学习笔记(kk-zkx)

前言 流行的编程语言编程语言的大致发展历程编程语言应用数据在内存中的储存程序载入内存ASCII编码GB2312和GBKUnicode字符集&#xff08;统一码&#xff0c;万国码&#xff09;就业坑&#xff0c;当心 编程语言&#xff1a;用来控制计算机&#xff0c;让计算机为我们做事情的语…

C语言简介--学前必备知识

关键字 32个关键字&#xff1a; C和C的关系 C 主要在C语言的基础上增加了面向对象和泛型的机制&#xff0c;提高了开发效率&#xff0c;以适用于大中型软件的编写。C支持面向过程编程、面向对象编程和泛型编程&#xff0c;而C语言仅支持面向过程编程。就面向过程编程而言&a…

C语言入门篇——文件操作篇

目录 1、为什么使用文件 2、什么是文件 2.1程序文件 2.2数据文件 2.3文件名 3、文件的打开和关闭 3.1文件指针 3.2文件的打开和关闭 4、文件的顺序读写 5、文件的随机读写 5.1fseek 5.2ftell 5.3rewind 6、文本文件和二进制文件 7、文件读取结束的判定 8、文件…