近日朋友在做一个跟图像处理相关的项目,问了一些图像处理相关的问题,因为以前对于图像处理也是一知半解,所以就研究了一下图像处理相关的技术。
首先我们要知道什么是图片?抛开各种各样的图片格式,我认为图片就是一个由不同颜色的像素点组成的二维数组(个人理解)。那么什么又是颜色呢?表示颜色的方式有很多种,如RGB,CMYK,HSB,Hex等等。因为我是用RGB方式来处理的,所以这里只简单介绍RGB方式,我们知道颜色是通过红(Red),绿(Green),蓝(Blue)三种颜色分量的不同,组合成不同的颜色。所以对图片的处理就是对RGB值大小的处理。
需求是给定一张图片有污点的图片,如下图。选中有污点的区域—>点击去污—>去除选中区域的污点。
拿到需求先理清楚思路,先选中要去污的区域(获取选中区域的坐标)—>获取背景颜色集合(因为背景色有多个颜色)—>找到污点的坐标集合(这里只是简单的跟背景色对比色差值,跟背景色差值较大的就认定为污点)—>将污点坐标的颜色替换成背景色。下面是根据思路写出来的代码:
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(用来过滤污点)数字是我这调整后的最佳效果。下面是最终的效果: