图像处理技术(二)滤波去噪(下)
-----接上一篇文章------------------------------------------------------
六、 非局部去噪
使用非局部平均去噪算法进行图像去噪,并多次计算进行优化 CvInvoke.FastNlMeansDenoising(img, img);
七、 彩色模糊
色彩聚类平滑滤波 用于区域分割 CvInvoke.PyrMeanShiftFiltering(img, img, 5, 5, 2, new MCvTermCriteria(2));
八、 离散余弦变换DCT滤波
//////离散余弦变换(Dct)滤波 /// /// 图像加载到opencv的mat数据格式 /// 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 listmat = new List (); 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;//滤波核, Imageimg = new Image byte>((Bitmap)image); Image gray = img.Convert (); 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 滤波结果,小黑点基本除去干净