图像处理研究:去污

  近日朋友在作一个跟图像处理相关的项目,问了一些图像处理相关的问题,由于之前对于图像处理也是只知其一;不知其二,因此就研究了一下图像处理相关的技术。数组

  首先咱们要知道什么是图片?抛开各类各样的图片格式,我认为图片就是一个由不一样颜色的像素点组成的二维数组(我的理解)。那么什么又是颜色呢?表示颜色的方式有不少种,如RGB,CMYK,HSB,Hex等等。由于我是用RGB方式来处理的,因此这里只简单介绍RGB方式,咱们知道颜色是经过红(Red),绿(Green),蓝(Blue)三种颜色份量的不一样,组合成不一样的颜色。因此对图片的处理就是对RGB值大小的处理。dom

  需求是给定一张图片有污点的图片,以下图。选中有污点的区域—>点击去污—>去除选中区域的污点。spa

  拿到需求先理清楚思路,先选中要去污的区域(获取选中区域的坐标)—>获取背景颜色集合(由于背景色有多个颜色)—>找到污点的坐标集合(这里只是简单的跟背景色对比色差值,跟背景色差值较大的就认定为污点)—>将污点坐标的颜色替换成背景色。下面是根据思路写出来的代码:blog

      var selectB = test.SelectedBoundingBox;
            List<Color> bgcolors = new List<Color>();
            for (int i = selectB.Top; i < selectB.Top + selectB.Height; i++)
            {
                Color bgc = new Color();
                test.GetPixel(selectB.Left, i, ref bgc);
                if (!bgcolors.Exists((c) => { return c.GetHashCode() == bgc.GetHashCode() || System.Math.Abs(c.Color.ToArgb() - bgc.Color.ToArgb()) > 1000000; }))
                {
                    bgcolors.Add(bgc);
                }
            }

            Random ran = new Random();
            for (int i = selectB.Left; i < selectB.Left + selectB.Width; i++)
            {
                for (int j = selectB.Top; j < selectB.Top + selectB.Height; j++)
                {
                    int bgcIndex = ran.Next(0, bgcolors.Count - 1);
                    Color bgc = new Color();
                    test.GetPixel(i, j, ref bgc);
                    if (System.Math.Abs(bgc.Color.ToArgb() - bgcolors[bgcIndex].Color.ToArgb()) > 530000)
                    {
                        test.SetPixel(i, j, bgcolors[bgcIndex]);
                    }
                }
            }
            test.SaveImage("/temp/1.jpg");

  这里的代码比较简单,相信你们都能看懂,用随机数是为了让替换的背景看起来更加和谐。中间的1000000(用来过滤背景中色差较大的颜色)和530000(用来过滤污点)数字是我这调整后的最佳效果。下面是最终的效果:
图片

相关文章
相关标签/搜索