图像处理技术(二)滤波去噪
在图像处理领域中,在真正的应用过程前,通常需要对图像进行预先处理,达到去除干扰项的目的。滤波去噪就是其中的一项图像预处理工作。
在.NET下常用OpenCV进行图像处理工作,常用的.NET下的OpenCV库有Emgu CV和OpenCVSharp。
EmguCV是.NET平台下对OpenCV图像处理库的封装,也就是.NET版的OpenCV。由于OpenCV是用C和C++编写的,Emgu用C#对其进行封装,允许用.Net语言来调用OpenCV函数,如C#、VB、VC++等。
OpenCvSharp 是一个OpenCV的.Net wrapper,应用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV,有详细的使用样例供参考。。使用OpenCvSharp,可用C#,VB.NET等语言实现多种流行的图像处理(image processing)与计算机视觉(computer vision)算法。
本文将介绍利用Emgu CV进行图像处理滤波去噪的常用方法。
一、 中值滤波
Image image = Image.FromFile("xx.jpg"); Image<Bgr, byte> img = new Image<Bgr, byte>((Bitmap)image);//实例化一个三通道的OPENCV的图像对象 Int k=3;//滤波核,奇数img =img.SmoothMedian(k);//按照指定的滤波核进行中值滤波 Bitmap bitmap= img.Bitmap;//输出Bitmap格式的结果原图
二、 高斯滤波
Image image = Image.FromFile("xx.jpg"); Image<Bgr, byte> img = new Image<Bgr, byte>((Bitmap)image);//实例化一个三通道的OPENCV的图像对象 Int k=3;//滤波核,奇数 img = img. SmoothGaussian (k);//按照指定的滤波核进行高斯滤波 Bitmap bitmap= img.Bitmap;//输出Bitmap格式的结果三、 均值滤波
Image image = Image.FromFile("xx.jpg"); Image<Bgr, byte> img = new Image<Bgr, byte>((Bitmap)image);//实例化一个三通道的OPENCV的图像对象 Int k=3;//滤波核,奇数 img = img. SmoothBlur (k,k);//按照指定的滤波核进行均值滤波 Bitmap bitmap= img.Bitmap;//输出Bitmap格式的结果四、 方框滤波
Image image = Image.FromFile("xx.jpg"); Image<Bgr, byte> img = new Image<Bgr, byte>((Bitmap)image);//实例化一个三通道的OPENCV的图像对象 Int k=3;//滤波核,奇数 CvInvoke.BoxFilter(img, img, DepthType.Default, new Size(k, k), new Point(-1, -1));//按照指定的滤波核进行方框滤波 Bitmap bitmap= img.Bitmap;//输出Bitmap格式的结果五、 双边滤波
Image image = Image.FromFile("xx.jpg"); Image<Bgr, byte> img = new Image<Bgr, byte>((Bitmap)image);//实例化一个三通道的OPENCV的图像对象 Int k=3;//滤波核,奇数 CvInvoke.EdgePreservingFilter(img, img, EdgePreservingFilterFlag.NormconvFilter, k, 0.4f);;//按照指定的滤波核进行双边滤波 Bitmap bitmap= img.Bitmap;//输出Bitmap格式的结果六、 非局部去噪
CvInvoke.FastNlMeansDenoising(img, img);七、 彩色模糊
色彩聚类平滑滤波 用于区域分割 CvInvoke.PyrMeanShiftFiltering(img, img,5, 5, 2, newMCvTermCriteria(2));八、 离散余弦变换DCT滤波
/// <summary>///离散余弦变换(Dct)滤波 /// </summary>/// <param name="mat">图像加载到opencv的mat数据格式</param>/// <returns></returns>public static Mat Dct(Mat mat){if (mat.NumberOfChannels < 3)//单通道图像,即二值化图或者灰度图{if (mat.Size.Height % 2 != 0)//图像长宽需要为偶数,如果不是则进行扩边处理{CvInvoke.CopyMakeBorder(mat, mat, 0, 1, 0, 0, BorderType.Constant);}if (mat.Size.Width % 2 != 0) //图像长宽需要为偶数,如果不是则进行扩边处理{CvInvoke.CopyMakeBorder(mat, mat, 0, 0, 0, 1, BorderType.Constant);}Mat matdst = new Mat();Emgu.CV.XPhoto.XPhotoInvoke.DctDenoising(mat, matdst, 8);return matdst;}else{Mat[] Matbgr = mat.Split();//三通道图像,需要拆分三个独立的单通道进行处理,for (int i = 0; i < Matbgr.Length; i++){Matbgr[i] = Dct(Matbgr[i]);//按单通道处理}List<Mat> listmat = new List<Mat>();for (int i = 0; i < Matbgr.Length; i++){listmat.Add(Matbgr[i]);}VectorOfMat vm = new VectorOfMat(listmat.ToArray());//合并处理后的通道CvInvoke.Merge(vm, mat);return mat;}}九、 阈值滤波
思路:
图像转成灰度
计算灰度平均值
以灰度平均值作为临界点进行二值化处理
轮廓检测
遍历所有的轮廓,得到每个轮廓的矩形范围(一般就是每个噪声点的范围)
判断每个矩形的长宽是否小于给定值,并用白色在原来的图像上进行填充,即把认为是噪点的范围用白色颜色填充
返回处理后的图像
k=15过滤后的结果
QQ技术交流群:318860399
总结
以上是生活随笔为你收集整理的图像处理技术(二)滤波去噪的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 初识MASA Blazor
- 下一篇: 如何判断一个程序是 32bit 还是 6