基于阈值分解的多级中值滤波-附代码
代码 基于 分解 滤波 多级 阈值
2023-09-14 09:14:48 时间
基于阈值分解的多级中值滤波-附代码
基于阈值分解的多级中值滤波的结构如下所示:
首先对整个图像统计,得到均值m,和标准差δ,并进行阈值的分解,阈值分解函数Ti()为:
从图1中,噪灰度图像首先在(m-kδ)和(m+kδ),两个阈值上分解为2个二值图像。k为参数,适当选择k可以使这2个二值图像反映大部分脉冲噪声所处位置的信息。2幅二值图像经过中值滤波后再分别于滤波之前的二值图像作“异或Xor”运算,其目的是得到已被滤除的脉冲噪声位置。然后再对2幅图做“或or”运算,就可以得到总体脉冲噪声位置分布矩阵。最后在噪声位置处滤波,这样可以在去除噪声的同时尽可能地保留细节。
代码如下:
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void YZmedian(Mat& I, Mat& Iout, int n=3, double k=1.6)
{
cvtColor(I,I,COLOR_BGR2GRAY);//灰度图转换
Mat temp_m,temp_std; //定义均值方差矩阵
meanStdDev(I,temp_m,temp_std);//求均值方差矩阵
double Im_m=temp_m.at<double>(0,0);//均值
double Im_std=temp_std.at<double>(0,0);//方差
double t1=Im_m-k*Im_std;//阈值1
double t2=Im_m+k*Im_std;//阈值2
Mat I1=I.clone();
Mat I2=I.clone();
int width=I.cols;
int height=I.rows;
for (int i = 0; i < height; i++)
{
uchar* data1 =I1.ptr<uchar>(i);
uchar* data2=I2.ptr<uchar>(i);
for (int j = 0; j < width; j++)
{
if (data1[j]>=t1)
{
data1[j]=1;
}
else
{
data1[j]=0;
}
if (data2[j]>=t2)
{
data2[j]=1;
}
else
{
data2[j]=0;
}
}
}
Mat I11,I22;
medianBlur(I1,I11,n);//中值滤波
medianBlur(I2,I22,n);//中值滤波
Mat I111,I222;
bitwise_xor(I1,I11,I111);
bitwise_xor(I2,I22,I222);
Mat I3;
bitwise_or(I111,I222,I3);
/*扩展边界方便滤波*/
Mat I4(Size(I3.rows+(n-1),I3.cols+(n-1)),CV_8U,Scalar(0));
Mat I5(Size(I3.rows+(n-1),I3.cols+(n-1)),CV_8U,Scalar(0));
I.copyTo(I4(Range((n-1)/2,I4.rows-(n-1)/2),Range((n-1)/2,I4.cols-(n-1)/2)));
I3.copyTo(I5(Range((n-1)/2,I4.rows-(n-1)/2),Range((n-1)/2,I4.cols-(n-1)/2)));
//在噪声处滤波
for (int i = 0; i < I4.rows; i++)
{
uchar* data1=I4.ptr<uchar>(i);
uchar* data2=I5.ptr<uchar>(i);
for (int j = 0; j < I4.cols; j++)
{
if(data2[j]==1)
{
Mat roi=I4(Range(i-(n-1)/2,i+(n-1)/2),Range(j-(n-1)/2,j+(n-1)/2));
resize(roi,roi,Size(1,n*n));
Mat index;
sortIdx(roi,index,SORT_EVERY_COLUMN+SORT_ASCENDING);
int x=index.at<int>((n*n-1)/2);
data1[j]=roi.at<uchar>(x);
}
}
}
Iout=I4(Range((n-1)/2,I4.rows-(n-1)/2),Range((n-1)/2,I4.cols-(n-1)/2)).clone();
}
int main()
{
Mat I=imread("Nimg.png");//读取原始图片
Mat Iout;
Mat Imdian;
medianBlur(I,Imdian,7);
YZmedian(I,Iout,7,1.6);
imshow("原始图像",I);
imshow("基于阈值分解的多级中值滤波后的图像",Iout);
imshow("传统中值滤波",Imdian);
waitKey(0);
return 0;
}
结果如下图所示:
个人资料介绍
相关文章
- 代码审计-thinkphp3.2.3框架漏洞sql注入
- 用FireFox的插件XSS Me来检测网站代码的XSS问题
- ios swift5 代码只执行一次 dispatch_once
- 玩转低代码-CSS介绍
- DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练&测试过程全记录
- ML之ME/LF:基于不同机器学习框架(sklearn/TF)下算法的模型评估指标(损失函数)代码实现及其函数(Scoring/metrics)代码实现(仅代码)
- 基于主从博弈理论的共享储能与综合能源微网优化运行研究(Matlab代码实现)
- 基于蚁群算法求解运钞车路径规划问题(Matlab代码实现)
- 【库存控制】基于象鼻虫损害优化算法求解库存控制问题(Matlab代码实现)
- 基于广义benders分解法的综合能源系统优化规划(Matlab代码实现)
- 【故障定位】基于多元宇宙算法的主动配电网故障定位方法研究(Matlab代码实现)
- 基于四旋翼无人机的PD控制研究(Matlab代码实现)
- 【模式分解】基于物理场的动态模式分解研究(Matlab代码实现)
- 基于热传导矩阵(HCM)边缘检测方法在红外图像中的应用(Matlab代码实现)
- 数学建模学习(49):灰色预测案例二(案例+代码模板)
- 有了这个框架,平台开发谁还手敲代码?
- 基于蜣螂算法的极限学习机(ELM)回归预测-附代码
- 基于粒子群算法改进的DELM预测 -附代码
- 基于海鸥算法优化的Elman神经网络数据预测-附代码
- 精英反向黄金正弦鲸鱼算法-附代码
- 【CSS】课程网站 Banner 制作 ① ( Banner 栏测量 | Banner 盒子模型代码 | 代码示例 )
- 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 )
- 012-基于 git hooks 的前端代码质量控制解决方案
- 贡献指南,带你启航:如何给OpenMLDB社区贡献代码
- 066:vue+openlayers画各种图形并获取feature信息( 示例代码 )
- liunx 上传 代码到github
- 3D点云重建0-11:MVSNet-源码解析(7)-测试评估代码解析(完结篇)
- javascript常用代码【格式化时间日期】
- 【分布式版本控制系统Git】| 国内代码托管中心-Gitee、自建代码托管平台-GitLab
- 【状态估计】基于PMU的多回路配电系统状态估计(Matlab代码实现)
- 图像去雾:基于暗通道的去雾算法 - 附代码