近日朋友在作一個跟圖像處理相關的項目,問了一些圖像處理相關的問題,由於之前對於圖像處理也是隻知其一;不知其二,因此就研究了一下圖像處理相關的技術。數組
首先咱們要知道什麼是圖片?拋開各類各樣的圖片格式,我認爲圖片就是一個由不一樣顏色的像素點組成的二維數組(我的理解)。那麼什麼又是顏色呢?表示顏色的方式有不少種,如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(用來過濾污點)數字是我這調整後的最佳效果。下面是最終的效果:
圖片