圖像處理——灰度化、二值化、膨脹算法、腐蝕算法以及開運算和閉運算


一、RGB

RGB色彩模式使用RGB模型為圖像中每個像素的RGB分量分配一個0~255范圍內的強度值。RGB圖像僅僅使用三種顏色,R(red)、G(green)、B(blue),就能夠使它們依照不同的比例混合,在屏幕上呈現16777216(256 * 256 * 256)種顏色。

在電腦中,RGB的所謂“多少”就是指亮度,並使用整數來表示。通常情況下,RGB各有256級亮度,用數字表示為從0、1、2...直到255。


二、ARGB

一種 色彩模式,也就是 RGB色彩模式附加上Alpha( 透明度)通道,常見於32位 位圖存儲結構
ARGB---Alpha,Red,Green,Blue.


三、灰度化

 在RGB模型中,假設R=G=B時,則彩色表示一種灰度顏色,當中R=G=B的值叫灰度值,因此,灰度圖像每一個像素僅僅需一個字節存放灰度值(又稱強度值、亮度值),灰度范圍為0-255。一般有下面四種方法對彩色圖像進行灰度化,詳細方法參考: http://blog.csdn.net/evsqiezi/article/details/7905436   


四、二值化

一幅圖像包含目標物體、背景還有噪聲,要想從多值的數字圖像中直接提取出目標物體,最經常使用的方法就是設定一個全局的閾值T,用T將圖像的數據分成兩部分:大於T的像素群和小於T的像素群。將大於T的像素群的像素值設定為白色(或者黑色),小於T的像素群的像素值設定為黑色(或者白色)。
比方:計算每個像素的(R+G+B)/3,假設>127,則設置該像素為白色,即R=G=B=255;否則設置為黑色,即R=G=B=0。
C#實現代碼例如以下:
public Bitmap binarization()
        {
            Bitmap bitImage = new Bitmap(pictureBox1.Image);//二值化pictureBox1中的圖片
            Color c;
            int height = pictureBox1.Image.Height;
            int width = pictureBox1.Image.Width;
            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    c = bitImage.GetPixel(j,i);
                    int r = c.R;
                    int g = c.G;
                    int b = c.B;
                    if ((r + g + b) / 3 >= 127)
                    {                       
                        bitImage.SetPixel(j, i, Color.FromArgb(255, 255, 255));                  
                    }
                    else
                    {     
                        bitImage.SetPixel(j, i, Color.FromArgb(0,0,0));
                    }
                }
            }
            return bitImage;
        }
執行結果如圖:
左邊為處理前,右邊為二值化后效果。


五、膨脹算法

膨脹是將與物體接觸的全部背景點合並到該物體中,使邊界向外部擴張的過程。

能夠用來填補物體中的空洞。

 

3x3的結構元素,掃描圖像的每個像素

用結構元素與其覆蓋的二值圖像做操作

假設都為0,結果圖像的該像素為0。否則為1

結果:使二值圖像擴大一圈


膨脹(dilation)能夠看做是腐蝕的對偶運算,其定義是:把結構元素B平移a后得到Ba,若Ba擊中X,我們記下這個a點。全部滿足上述條件的a點組成的集合稱做XB膨脹的結果。用公式表示為:D(X)={a | BaX}=X腐蝕,膨脹,細化算法B,例如以下圖所看到的。圖X是被處理的對象,B是結構元素,不難知道,對於隨意一個在陰影部分的點aBa擊中X,所以XB膨脹的結果就是那個陰影部分。陰影部分包含X的全部范圍,就象X膨脹了一圈似的,這就是為什么叫膨脹的原因。



在下圖中,左邊是被處理的圖象X(二值圖象,我們針對的是黑點),中間是結構元素B。膨脹的方法是,拿B的中心點和X上的點及X周圍的點一個一個地對,假設B上有一個點落在X的范圍內,則該點就為黑;右邊是膨脹后的結果。能夠看出,它包含X的全部范圍,就象X膨脹了一圈似的。




我設計了一個簡單的膨脹算法,依次遍歷整個圖片的像素,分析每個像素的周圍八個像素,僅僅要該像素周圍存在黑色的像素,就設置該像素顏色為黑色。以下是使用膨脹算法處理經過二值化后的圖像的C#實現代碼:

public bool[] getRoundPixel(Bitmap bitmap, int x, int y)//返回(x,y)周圍像素的情況,為黑色,則設置為true
        {
            bool[] pixels=new bool[8];
            Color c;
            int num = 0;
            for (int i = -1; i < 2; i++)
            {
                for (int j = -1; j < 2; j++)
                {
                    c = bitmap.GetPixel(x+i,y+j);
                    if (i != 0 || j != 0)
                    {
                        if (255 == c.G)//由於經過了二值化,所以僅僅要檢查RGB中一個屬性的值
                        {
                            pixels[num] = false;//為白色,設置為false
                            num++;
                        }
                        else if(0==c.G)
                        {
                            pixels[num] = true;//為黑色,設置為true
                            num++;
                        }
                    }
                }
            }
            return pixels;
        }


public Bitmap expend()
        {
            Bitmap bitImage = new Bitmap(pictureBox2.Image);//處理pictureBox2中的圖片
            Bitmap bitImage1 = new Bitmap(pictureBox2.Image);
            int height = pictureBox1.Image.Height;
            int width = pictureBox1.Image.Width;
            bool[] pixels;
            for (int i = 1; i < width-1; i++)
            {
                for (int j = 1; j < height-1; j++)
                {
                    
                    if (bitImage.GetPixel(i, j).R != 0)
                    {
                        pixels = getRoundPixel(bitImage, i, j);
                        for (int k = 0; k < pixels.Length; k++)
                        {
                            if (pixels[k] == true)
                            {
                                //set this piexl's color to black
                                bitImage1.SetPixel(i, j, Color.FromArgb(0,0,0));
                                break;
                            }
                        }
                    }
                }
            }
                return bitImage1;

        }


執行結果如圖:


六、腐蝕算法


腐蝕是一種消除邊界點,使邊界向內部收縮的過程。能夠用來消除小且無意義的物體。



3x3的結構元素,掃描圖像的每個像素


用結構元素與其覆蓋的二值圖像做操作


假設都為1,結果圖像的該像素為1。否則為0


結果:使二值圖像減小一圈

把結構元素B平移a后得到Ba,若Ba包括於X,我們記下這個a點,全部滿足上述條件的a點組成的集合稱做XB腐蝕(Erosion)的結果。用公式表示為:E(X)={a| Ba 腐蝕,膨脹,細化算法X}=X 腐蝕,膨脹,細化算法B。



下圖中X是被處理的對象,B是結構元素。不難知道,對於隨意一個在陰影部分的點aBa包括於X,所以XB腐蝕的結果就是那個陰影部分。陰影部分在X的范圍之內,且比X小,就象X被剝掉了一層似的,這就是為什么叫腐蝕的原因。


我設計了一個簡單的腐蝕算法,一次遍歷圖像中每個像素,檢查它四周的八個像素,假設有白色的像素,則設置改點為白色。用二值化處理后的圖片進行腐蝕算法C#代碼例如以下:


public Bitmap corrode()
        {
            Bitmap bitImage = new Bitmap(pictureBox2.Image);
            Bitmap bitImage1 = new Bitmap(pictureBox2.Image);
            Color c;
            int height = pictureBox1.Image.Height;
            int width = pictureBox1.Image.Width;
            bool[] pixels;
            for (int i = 1; i < width - 1; i++)
            {
                for (int j = 1; j < height - 1; j++)
                {
                    c = bitImage.GetPixel(i, j);
                    if (bitImage.GetPixel(i, j).R == 0)
                    {
                        pixels = getRoundPixel(bitImage, i, j);
                        for (int k = 0; k < pixels.Length; k++)
                        {
                            if (pixels[k] == false)
                            {
                                //set this piexl's color to black
                                bitImage1.SetPixel(i, j, Color.FromArgb(255, 255, 255));
                                break;
                            }
                        }
                    }
                }
            }
            return bitImage1;
        }

處理后圖片變成:



七、開運算

先腐蝕后膨脹的過程稱為開運算。用來消除小物體、在纖細點處分離物體、平滑較大物體的邊界的同一時候並不明顯改變其面積。


八、閉運算

先膨脹后腐蝕的過程稱為閉運算。用來填充物體內細小空洞、連接鄰近物體、平滑其邊界的同一時候並不明顯改變其面積。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM