图像处理技术(二)滤波去噪(下)
-----接上一篇文章------------------------------------------------------
六、 非局部去噪
1 2 | 使用非局部平均去噪算法进行图像去噪,并多次计算进行优化 CvInvoke.FastNlMeansDenoising(img, img); |
七、 彩色模糊
1 2 | 色彩聚类平滑滤波 用于区域分割 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 滤波结果,小黑点基本除去干净
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!