圖像處理研究:去污

  近日朋友在作一個跟圖像處理相關的項目,問了一些圖像處理相關的問題,由於之前對於圖像處理也是隻知其一;不知其二,因此就研究了一下圖像處理相關的技術。數組

  首先咱們要知道什麼是圖片?拋開各類各樣的圖片格式,我認爲圖片就是一個由不一樣顏色的像素點組成的二維數組(我的理解)。那麼什麼又是顏色呢?表示顏色的方式有不少種,如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(用來過濾污點)數字是我這調整後的最佳效果。下面是最終的效果:
圖片

相關文章
相關標籤/搜索