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

发布时间:2022-06-26 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了图像处理技术(二)滤波去噪(下)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

-----接上一篇文章------------------------------------------------------

六、     非局部去噪

使用非局部平均去噪算法进行图像去噪,并多次计算进行优化
  CvInvoke.FastNlMeansDenoising(img, img);

  

七、     彩色模糊

色彩聚类平滑滤波    用于区域分割
CvInvoke.PyrMeanShiftFiltering(img, img, 5, 5, 2, new MCvTermCrITeria(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;
            }
        }

九、     阈值滤波

 

思路:

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;

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

k=15 滤波结果,小黑点基本除去干净

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

 

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

 

脚本宝典总结

以上是脚本宝典为你收集整理的图像处理技术(二)滤波去噪(下)全部内容,希望文章能够帮你解决图像处理技术(二)滤波去噪(下)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。