文档章节

简单图像填充算法

魂祭心
 魂祭心
发布于 2015/12/20 19:40
字数 573
阅读 105
收藏 2

填充算法

递归

   private void fillsearch(Bitmap bmp, int x, int y, byte[,] flag,int num)
        {
            //向左   如果为1返回 如果不是1  计算当前值 如果不在范围内设为1返回 并且向下递归
            if (Math.Abs(bmp.GetPixel(x, y).B - num) >50)
            {
                flag[x, y] = 2;
                return;
            }
            else
            {
                flag[x, y] =1;
            }
            if (0 ==x || x == bmp.Width-1) return;
            if(0==y||y==bmp.Height-1)      return;

            if (flag[x - 1, y] == 0)
            {
                fillsearch(bmp, x - 1, y, flag, num);
            }
            if (flag[x, y-1] == 0)
            {
                fillsearch(bmp, x , y-1, flag, num);
            }

            if (flag[x+1, y] == 0)
            {
                fillsearch(bmp, x+1, y, flag, num);
            }

            if (flag[x , y+1] == 0)
            {
                fillsearch(bmp, x , y+1, flag, num);
            }
        }

递归算法不太好用,小图片还可以。大图片我的机器上递归到1万多层就提示无法创建堆栈防护页。

非递归算法:

        /// <summary>
        ///   填充算法
        /// </summary>
        /// <param name="bmp"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        private Bitmap fillin(Bitmap bmp, int x, int y)
        {
            Bitmap map = new Bitmap(bmp.Width+2,bmp.Height+2);
            for (int i = 0; i < bmp.Width; i++)
            {
                for (int j = 0; j < bmp.Height; j++)
                {
                    map.SetPixel(i + 1, j + 1, bmp.GetPixel(i, j));
                }
            }
            Byte[,] flag=new  Byte[bmp.Width+2,bmp.Height+2];
            for (int i = 0; i < map.Width; i++)
            {
                for (int j = 0; j < map.Height; j++)
                {
                    flag[i, j] = 0;
                }
            }
            for (int i = 0; i < map.Width; i++)
            {
                flag[i, 0] = 2;
                flag[i, map.Height-1] = 2;
            }
            for (int i = 0; i < map.Height; i++)
            {
                flag[0, i] = 2;
                flag[map.Width-1, i] = 2;
            }

            Stack<Point> colors = new Stack<Point>();
            colors.Push(new Point(x,y));
            int colorB = map.GetPixel(x, y).B;
            while (colors.Count != 0)
            {
                x--;
                if (flag[x, y] == 0)
                {
                    if (Math.Abs(map.GetPixel(x, y).B - colorB) > 50)
                    {
                        flag[x, y] = 2;
                    }
                    else
                    {
                        flag[x, y] = 1;
                        colors.Push(new Point(x, y));
                        continue;
                    }
                }
                else {
                    x++;
                }
                y--;
                if (flag[x, y] == 0)
                {
                    if (Math.Abs(map.GetPixel(x, y).B - colorB) > 50)
                    {
                        flag[x, y] = 2;
                    }
                    else
                    {
                        flag[x, y] = 1;
                        colors.Push(new Point(x, y)); continue;
                    }
                }
                else { y++; }
                x++;
                if (flag[x, y] == 0)
                {
                    if (Math.Abs(map.GetPixel(x, y).B - colorB) > 50)
                    {
                        flag[x, y] = 2;
                    }
                    else
                    {
                        flag[x, y] = 1;
                        colors.Push(new Point(x, y)); continue;
                    }
                }
                else
                {
                    x--;
                }
                y++;
                if (flag[x, y] == 0)
                {
                    if (Math.Abs(map.GetPixel(x, y).B - colorB) > 50)
                    {
                        flag[x, y] = 2;
                    }
                    else
                    {
                        flag[x, y] = 1;
                        colors.Push(new Point(x, y)); continue;
                    }
                }
                else { y--; }
                      Point p=  colors.Pop();
                      x = p.X;
                      y = p.Y;
            }

            Bitmap b = (Bitmap)bmp.Clone();
            for (int i = 0; i < b.Width; i++)
            {
                for (int j = 0; j < b.Height; j++)
                {
                    if (flag[i+1,j+1] == 1)
                    {
                        b.SetPixel(i, j, Color.FromArgb(255, 0, 0));
                    }
                    else if (flag[i+1, j+1] == 2)
                    {
                        b.SetPixel(i, j, Color.FromArgb(0, 255 , 0));
                    }
                    else
                    {
                        b.SetPixel(i, j, Color.FromArgb(0, 0, 255));
                    }
                }
            }
            return b;
        }

非递归算法,递归转递推。首先图片扩充一圈像素,设置已搜索的标记,简化边界判定。压栈出栈搜索。

测试结果


© 著作权归作者所有

魂祭心
粉丝 12
博文 51
码字总数 84650
作品 0
浦东
后端工程师
私信 提问
膨胀、腐蚀、开、闭运算——数字图像处理中的形态学

膨胀、腐蚀、开、闭运算是数学形态学最基本的变换。 本文主要针对二值图像的形态学 膨胀:把二值图像各1像素连接成分的边界扩大一层(填充边缘或0像素内部的孔); 腐蚀:把二值图像各1像素连...

xiachong27
2018/05/23
0
0
反向投影图

本次要讲的范例是反向投影,反向投影如果是按照字面上的理解,还有书本上的理解可能会比较困难,但是如果是举一些具体的简单的例子,那可能就比较容易接受了,应用的话,可以检测出肤色区域,...

元禛慎独
2016/10/18
4
0
【图像处理】基于半色调技术的图像打印程序(Image Printing Program Based on Halftoning)

实验要求   本实验后面的图像给出了用点模式近似表示的10 个灰度级。每一个灰度级用一个3 x 3 的黑白点模式表示。用黑点全部填充的3 x 3 区域近似表示灰度级为0 的黑色灰度级,全部填充白点...

u013165921
2018/01/14
0
0
有意思的数字盲水印的简单的实现。

  早期大约是10年前从一本数字图像处理上看到过数字水印的概念,觉得确实一种很有意思的东西,那个时候主要就是基于LSB的图像信息的隐藏,这种在空域里的方法有较大的缺陷,鲁棒性是比较差...

Imageshop
2018/12/10
0
0
图像放缩中最近邻插值和双线性插值的基本原理

图像的缩放很好理解,就是图像的放大和缩小。传统的绘画工具中,有一种叫做“放大尺”的绘画工具,画家常用它来放大图画。当然,在计算机上,我们不再需要用放大尺去放大或缩小图像了,把这个工...

andrew659
2009/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySql双主架构原理

在企业中,一般系统架构的瓶颈会出现在数据库这一部分,mysql主从架构在很大程度上解决了这部分瓶颈,但是在mysql主从同步的架构也存在很多问题;比如:1.关于数据写入部分(也就是主库)往往很难做...

xiaomin0322
21分钟前
0
0
分布式系统中一致性哈希

问题场景 近年来B2C、O2O等商业概念的提出和移动端的发展,使得分布式系统流行了起来。分布式系统相对于单系统,解决了流量大、系统高可用和高容错等问题。功能强大也意味着实现起来需要更多...

Java领航员
22分钟前
0
0
接口限流算法:漏桶算法和令牌桶算法

漏桶算法 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。这一点和线程池原理是很相似的。 把请求比作是水,水来了都先放进桶里,并以限定...

铁骨铮铮
29分钟前
1
0
Android 生成二维码工具类

/** * 生成条形码和二维码的工具 */public class ZXingUtils { /** * 生成二维码 要转换的地址或字符串,可以是中文 * * @param url * @param width ...

lanyu96
34分钟前
1
0
谈谈lucene的DocValues特性之SortedNumericDocValuesField

前面已经介绍过NumericDocValuesField,这里想强调一下SortedNumericDocValuesField是针对同一篇文档中一键多值的情况进行排序的,换句话说不同文档的同一字段值可以乱序。核心的写入流程与谈...

FAT_mt
42分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部