前面已经讲过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; }
注意:这里的膨胀是将黑色区域变大膨胀,不是白色区域,如需白色区域膨胀,可以使用膨胀算法的逆运算腐蚀算法,或者先将二值化图像翻转(黑白颠倒),膨胀后再次翻转。
此代码仅供学习膨胀算法使用,因其存在效率问题,不建议项目中使用。
评论 (0)