前面已经讲过C#实现图像灰度化、二值化的算法,今天讲C#图像算法膨胀算法实现。正好前面已经讲过膨胀算法原理,应该理解起来不是很难。我在网上看到一位网友写的膨胀算法,结构清晰,方便阅读,摘抄下来分享给大家学习。
实现效果如上图所示,左边是二值化后的图像,右边是其膨胀后的图像。膨胀结构体如下图所示,占据三个像素的垂直镜像的L。
C#代码
/// <summary>/// 膨胀算法/// </summary>/// <param name="image"></param>/// <returns></returns>private Bitmap GetPengZhangImage(Bitmap image){List<Point> setList = new List<Point>();Bitmap result = image.Clone() as Bitmap;for (int i = 0; i < result.Width; i++){for (int j = 0; j < result.Height; j++){// 如果应该设置为黑色的if (SetPixelPengZhang(result, i, j)){setList.Add(new Point(i, j));}}}//膨胀运算int x, y;foreach (var item in setList){x = item.X;y = item.Y;result.SetPixel(x - 1, y, Color.Black);result.SetPixel(x, y - 1, Color.Black);}return result;}// 判断这个点应不应该设置为黑色protected bool SetPixelPengZhang(Bitmap image, int i, int j){Color c = image.GetPixel(i, j);if (i != 0 && j != 0){if (image.GetPixel(i, j).ToArgb() == Color.Black.ToArgb()){return true;}else return false;}else return false;}
注意:这里的膨胀是将黑色区域变大膨胀,不是白色区域,如需白色区域膨胀,可以使用膨胀算法的逆运算腐蚀算法,或者先将二值化图像翻转(黑白颠倒),膨胀后再次翻转。
此代码仅供学习膨胀算法使用,因其存在效率问题,不建议项目中使用。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/241339.html