图像处理研究:去污

  近日朋友在做一个跟图像处理相关的项目,问了一些图像处理相关的问题,因为以前对于图像处理也是一知半解,所以就研究了一下图像处理相关的技术。

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

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

图像处理研究:去污_第1张图片

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

      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(用来过滤污点)数字是我这调整后的最佳效果。下面是最终的效果:

图像处理研究:去污_第2张图片

你可能感兴趣的:(图像处理研究:去污)