Win8 Metro(C#)数字图像处理--2.66FloodFill算法
来源:互联网 发布:拍卖东西的软件 编辑:程序博客网 时间:2024/04/28 08:13
[函数名称]
洪水填充算法函数
WriteableBitmap FloodfillProcess(WriteableBitmap src,Point location, Color fillColor, int threshold)
2,以这个点为起点,将它压入栈中,假设我们要填充的颜色为A,则将该点颜色设置为A,然后判断它的四邻域像素,这里我们设置一个颜色阈值T,假设当前像素灰度值为P(x,y),四邻域像素为M(n),n=1,2,3,4,那么判断当前像素与四邻域像素的灰度差值D=|P-M|,如果D小于T, 那么我们将该像素M作为下一个种子点,压入栈中,否则继续判断。如图中黑色像素的四邻域内有一灰色点,与其差值小于T,则把它作为新的种子点压入栈中,继续判断。
3,当栈为空时,种子填充结束,否则重做步骤2。
[函数代码]
/// <summary> /// Flood fill. /// </summary> /// <param name="src">The source image.</param> /// <param name="location">The start point to be filled.</param> /// <param name="fillColor">The color to be filled.</param> /// <param name="threshold">One parameter to control fill effect, from 0 to 255.</param> /// <returns></returns> public static WriteableBitmap FloodfillProcess(WriteableBitmap src,Point location, Color fillColor, int threshold)////洪水填充算法 { if (src != null) { int w = src.PixelWidth; int h = src.PixelHeight; Stack<Point> fillPoints = new Stack<Point>(w * h); int[,] mask = new int[w, h]; WriteableBitmap fillImage = new WriteableBitmap(w, h); byte[] temp = src.PixelBuffer.ToArray(); byte[] tempMask = (byte[])temp.Clone(); Color backColor = Color.FromArgb(0,tempMask[(int)location.X * 4 + 2 + (int)location.Y * w * 4], tempMask[(int)location.X * 4 + 1 + (int)location.Y * w * 4], tempMask[(int)location.X * 4 + (int)location.Y * w * 4]); int gray = (int)((backColor.R + backColor.G + backColor.B) / 3); if (location.X < 0 || location.X >= w || location.Y < 0 || location.Y >= h) return null; fillPoints.Push(new Point(location.X, location.Y)); while (fillPoints.Count > 0) { Point p = fillPoints.Pop(); mask[(int)p.X, (int)p.Y] = 1; tempMask[4 * (int)p.X + (int)p.Y * w*4] = (byte)fillColor.B; tempMask[4 * (int)p.X + 1 + (int)p.Y * w*4] = (byte)fillColor.G; tempMask[4 * (int)p.X + 2 +(int) p.Y * w*4] = (byte)fillColor.R; if (p.X > 0 && (Math.Abs(gray - (int)((tempMask[4 * ((int)p.X - 1) + (int)p.Y * w * 4] + tempMask[4 * ((int)p.X - 1) + 1 + (int)p.Y * w * 4] + tempMask[4 * ((int)p.X - 1) + 2 + (int)p.Y * w * 4]) / 3)) < threshold) && (mask[(int)p.X - 1, (int)p.Y] != 1)) { tempMask[4 * ((int)p.X - 1) + (int)p.Y * w*4] = (byte)fillColor.B; tempMask[4 * ((int)p.X - 1) + 1 + (int)p.Y * w*4] = (byte)fillColor.G; tempMask[4 * ((int)p.X - 1) + 2 + (int)p.Y * w*4] = (byte)fillColor.R; fillPoints.Push(new Point(p.X - 1, p.Y)); mask[(int)p.X - 1, (int)p.Y] = 1; } if (p.X < w - 1 && (Math.Abs(gray - (int)((tempMask[4 * ((int)p.X + 1) + (int)p.Y * w * 4] + tempMask[4 * ((int)p.X + 1) + 1 + (int)p.Y * w * 4] + tempMask[4 * ((int)p.X + 1) + 2 + (int)p.Y * w * 4]) / 3)) < threshold) && (mask[(int)p.X + 1, (int)p.Y] != 1)) { tempMask[4 * ((int)p.X + 1) + (int)p.Y * w * 4] = (byte)fillColor.B; tempMask[4 * ((int)p.X + 1) + 1 + (int)p.Y * w * 4] = (byte)fillColor.G; tempMask[4 * ((int)p.X + 1) + 2 + (int)p.Y * w * 4] = (byte)fillColor.R; fillPoints.Push(new Point(p.X + 1, p.Y)); mask[(int)p.X + 1, (int)p.Y] = 1; } if (p.Y > 0 && (Math.Abs(gray - (int)((tempMask[4 * (int)p.X + ((int)p.Y - 1) * w * 4] + tempMask[4 * (int)p.X + 1 + ((int)p.Y - 1) * w * 4] + tempMask[4 * (int)p.X + 2 + ((int)p.Y - 1) * w * 4]) / 3)) < threshold) && (mask[(int)p.X, (int)p.Y - 1] != 1)) { tempMask[4 * (int)p.X + ((int)p.Y - 1) * w * 4] = (byte)fillColor.B; tempMask[4 * (int)p.X + 1 + ((int)p.Y - 1) * w * 4] = (byte)fillColor.G; tempMask[4 * (int)p.X + 2 + ((int)p.Y - 1) * w * 4] = (byte)fillColor.R; fillPoints.Push(new Point(p.X, p.Y - 1)); mask[(int)p.X, (int)p.Y - 1] = 1; } if (p.Y < h - 1 && (Math.Abs(gray - (int)((tempMask[4 * (int)p.X + ((int)p.Y + 1) * w * 4] + tempMask[4 * (int)p.X + 1 + ((int)p.Y + 1) * w * 4] + tempMask[4 * (int)p.X + 2 + ((int)p.Y + 1) * w * 4]) / 3)) < threshold) && (mask[(int)p.X, (int)p.Y + 1] != 1)) { tempMask[4 * (int)p.X + ((int)p.Y + 1) * w * 4] = (byte)fillColor.B; tempMask[4 * (int)p.X + 1 + ((int)p.Y + 1) * w * 4] = (byte)fillColor.G; tempMask[4 * (int)p.X + 2 + ((int)p.Y + 1) * w * 4] = (byte)fillColor.R; fillPoints.Push(new Point(p.X, p.Y + 1)); mask[(int)p.X, (int)p.Y + 1] = 1; } } fillPoints.Clear(); temp = (byte[])tempMask.Clone(); Stream sTemp = fillImage.PixelBuffer.AsStream(); sTemp.Seek(0, SeekOrigin.Begin); sTemp.Write(temp, 0, w * 4 * h); return fillImage; } else { return null; } }
最后,分享一个专业的图像处理网站(微像素),里面有很多源代码下载:
http://www.zealpixel.com/portal.php
0 0
- Win8 Metro(C#)数字图像处理--2.66FloodFill算法
- Win8 Metro(C#)数字图像处理--2.35图像肤色检测算法
- Win8 Metro(C#)数字图像处理--2.36角点检测算法
- Win8 Metro(C#)数字图像处理--2.42图像光照效果算法
- Win8 Metro(C#)数字图像处理--2.43图像马赛克效果算法
- Win8 Metro(C#)数字图像处理--2.44图像油画效果算法
- Win8 Metro(C#)数字图像处理--2.45图像雾化效果算法
- Win8 Metro(C#)数字图像处理--2.48Canny边缘检测算法
- Win8 Metro(C#)数字图像处理--2.51图像统计滤波算法
- Win8 Metro(C#)数字图像处理--2.60部分彩色保留算法
- Win8 Metro(C#)数字图像处理--2.65形态学轮廓提取算法
- Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法
- Win8 Metro(C#)数字图像处理--2.41彩色图像密度分割算法
- Win8 Metro(C#)数字图像处理--2.47人脸红眼去除算法
- Win8 Metro(C#)数字图像处理--2.49Zhang二值图像细化算法
- Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法
- Win8 Metro(C#)数字图像处理--2.75灰度图像的形态学算法
- Win8 Metro(C#) 数字图像处理--1 图像打开,保存
- Win8 Metro(C#)数字图像处理--2.65形态学轮廓提取算法
- 安卓中的四种枚举类型 SharedPreferences 文件的访问权限
- 上传图片到七牛
- 两种类型的人, 不需要敏捷开发的实践
- 蓝桥杯 历届试题【高僧斗法】
- Win8 Metro(C#)数字图像处理--2.66FloodFill算法
- 最优装载问题或者01背包问题的分支限界法求解
- Java代码实现删除一个有序数组里面的重复元素
- JUnit最简单的测试案例
- Hexadecimal View HDU 4054 简短代码 详解
- union、union all、 Intersect、minus的用法讲解
- windows server 2008/windows server 2012 无线网络驱动无法安装解决
- SElinux 配置与管理
- shell脚本判断闰年的逻辑表达式