影像處理---灰階處理(黑白效果)

來源:互聯網
上載者:User

標籤:style   class   blog   code   http   tar   

轉自:影像處理:黑白效果(灰階處理)

1.:
        

2.實現原理:
        映像灰階化就是使色彩的三種顏色分量R、G、B的值相同,由於顏色值的取值範圍是[0,255],所以灰階的
        層級只有256種,即灰階圖象僅能表現256種灰階顏色,常用有3種處理方法:
        *最大值法(Maximum):R=G=B=Max(R,G,B),這種方法處理後灰階圖象的亮度會偏高。
        *平均值法(Average):R=G=B=(R+G+B)/3,這種方法處理後灰階圖象的亮度較柔和。
        *加權平均值法(Weighted Average):
                R=G=B=wr*R+wg*G+wb*B,wr、wg、wb分別為R、G、B的權值。
                當其權值取不同的值時,能夠形成不同灰階的灰階圖象,由於人眼對綠色的敏感度最高,紅色次之,
                藍色最低,因此當wg > wr > wb時,所產生的灰階映像更符合人眼的視覺感受。
                通常wr=30%,wg=59%,wb=11%,映像的灰階最合理。
                以下的程式使用的是wr=70%,wg=20%,wb=10%覺得效果更好。

3.實現代碼:


1public enum AlgorithmsType
2    {
3       MaxValue,           //最大值法
4        AverageValue,       //平均值法
5        WeightAverage       //加權平均值法
6    }

public static Image Gray(Image img, AlgorithmsType algo)
        {
            int width = img.Width;
            int height = img.Height;

            Bitmap bmp = new Bitmap(img);

            //設定執行個體BitmapData相關資訊
            Rectangle rect = new Rectangle(0, 0, width, height);            
            ImageLockMode mode = ImageLockMode.ReadWrite;
            PixelFormat format = PixelFormat.Format32bppArgb;

            //鎖定bmp到系統記憶體中
            BitmapData data = bmp.LockBits(rect, mode, format);

            //擷取位元影像中第一個像素資料的地址
            IntPtr ptr = data.Scan0;

            int numBytes = width * height * 4;
            byte[] rgbValues = new byte[numBytes];            

            //將bmp資料Copy到申明的數組中
            Marshal.Copy(ptr, rgbValues, 0, numBytes);

            for (int i = 0; i < rgbValues.Length; i += 4)
            {
                int value = 0;
                switch (algo)
                {
                    //最大值法
                    case AlgorithmsType.MaxValue:
                        value = rgbValues[i] > rgbValues[i + 1] ? rgbValues[i] : rgbValues[i + 1];
                        value = value > rgbValues[i + 2] ? value : rgbValues[i + 2];
                        break;
                    //平均值法
                    case AlgorithmsType.AverageValue:
                        value = (int)((rgbValues[i] + rgbValues[i + 1] + rgbValues[i + 2]) / 3);
                        break;
                    //加權平均值法
                    case AlgorithmsType.WeightAverage:
                        value = (int)(rgbValues[i] * 0.1 + rgbValues[i + 1] * 0.2 
                            + rgbValues[i + 2] * 0.7);
                        break;
                }

                //將數組中存放R、G、B的值修改為計算後的值
                for (int j = 0; j < 3; j++)
                {
                    rgbValues[i + j] = (byte)value;
                }
            }

            //將資料Copy到記憶體指標
            Marshal.Copy(rgbValues, 0, ptr, numBytes);

            //從系統記憶體解鎖bmp
            bmp.UnlockBits(data);

            return (Image)bmp;

        }

 

4.說明:
        使用GetPixel方法和SetPixel方法的實現參考柔化(平滑)處理;
        使用不安全模式參考椒鹽雜訊(雜點) 方法一;
        本例實現方法與椒鹽雜訊(雜點)方法二相同。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.