图像处理技术(二)滤波去噪

在图像处理领域中,在真正的应用过程前,通常需要对图像进行预先处理,达到去除干扰项的目的。滤波去噪就是其中的一项图像预处理工作。

在.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格式的结果

原图

2c6f630da29d05b6ee8512eb229962ac.png

9a6373095731418f33558fb33046c3c3.pngde231e80a71adb99a2ffd23ff8850dae.png

二、     高斯滤波

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格式的结果

931dfdb94d5671d86094572c638beb80.png

443da43c6c7a567d1f2296f61e75cf21.png

三、     均值滤波

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格式的结果

cce5b82e0fc506d2a152d725e9e94760.png240302b8e015411c01b769086b27e7de.png

四、     方框滤波

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格式的结果

323cf0d94e6698284b0ae832b1ea7b99.pngd4d56b92baeb4bb1a035d138c6d1ef02.png

五、     双边滤波

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));

bb5f776589f951a1b9038fc8483f7931.png

010cd41bdfe08dda37cb68327a0c0b61.png

八、     离散余弦变换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;
            }
        }

九、     阈值滤波

思路:

  1. 图像转成灰度

  2. 计算灰度平均值

  3. 以灰度平均值作为临界点进行二值化处理

  4. 轮廓检测

  5. 遍历所有的轮廓,得到每个轮廓的矩形范围(一般就是每个噪声点的范围)

  6. 判断每个矩形的长宽是否小于给定值,并用白色在原来的图像上进行填充,即把认为是噪点的范围用白色颜色填充

  7. 返回处理后的图像

Image image = Image.FromFile("xx.jpg");
Int k=5;//滤波核,
  Image<Bgr, Byte> img = new Image<Bgr, byte>((Bitmap)image);
                Image<Gray, Byte> gray = img.Convert<Gray, Byte>();
                Gray average = gray.GetAverage();//平均值
                CvInvoke.Threshold(gray, gray, average.MCvScalar.V0 - average.MCvScalar.V0 * 0.2, 255, ThresholdType.Binary);//二值化


                using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
                {
                    CvInvoke.FindContours(gray, contours, gray, RetrType.List, ChainApproxMethod.ChainApproxSimple);
                    int count = contours.Size;
                    for (int i = 0; i < count; i++)
                    {
                        using (VectorOfPoint contour = contours[i])
                        using (VectorOfPoint approxContour = new VectorOfPoint())
                        {
                            Rectangle rec = CvInvoke.BoundingRectangle(contour);
                            if (rec.Width <= k && rec.Height <= k)
                            {
                                CvInvoke.Rectangle(img, rec, new MCvScalar(255, 255, 255), -1);
                            }
                        }
                    }
                }
                return img.Bitmap;

2c43660bf5827eef7aa03f7e8daf1667.png

k=15过滤后的结果

a2e3cbec149abb5dba65ff61413c9427.png

QQ技术交流群:318860399

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值