彩色圖像灰度化一般有四種方式 :

1、分量法

將彩色圖像中的三分量的亮度作為三個灰度圖像的灰度值

f1(i,j)=R(i,j),f2(i,j)=G(i,j),f3(i,j)=B(i,j)

 

2、最大值法

f(i,j)=max(R(i,j),G(i,j),B(i,j))

 

3、平均值法

f(i,j)=(R(i,j),G(i,j),B(i,j))/3

 

4、加權平均法

根據人眼敏感度對RGB三分量進行加權平均

f(i,j)= 0.299*R(i,j) + 0.587*G(i,j) + 0.114*B(i,j)

 

本實驗採用「加權平均法」之成果如下 :

 

C#

private static Bitmap grayscale(Bitmap srcBitmap)
{
    int width = srcBitmap.Width;
    int height = srcBitmap.Height;

    System.IntPtr srcScan, dstScan;
    BitmapData srcBmData, dstBmData;
    Bitmap dstBitmap =ImageExtract.InitPonitMethod(srcBitmap, width, height, out srcScan, out dstScan, out srcBmData, out dstBmData);


    unsafe //啟動不安全代碼
    {
        byte* srcP = (byte*)srcScan;
        byte* dstP = (byte*)dstScan;
        int srcOffset = srcBmData.Stride - width * 3;
        int dstOffset = dstBmData.Stride - width * 3;

        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++, srcP += 3, dstP += 3)
            {

                byte gray = (byte)(.299 * srcP[2] + .587 * srcP[1] + .114 * srcP[0]);
                for (int c = 0; c < 3; c++)
                    *(dstP + c) = gray;
            }
            srcP += srcOffset;
            dstP += dstOffset;
        }
    }

    srcBitmap.UnlockBits(srcBmData);
    dstBitmap.UnlockBits(dstBmData);
    return dstBitmap;
}

https://github.com/Lung-Yu/ImageToolBox/blob/master/ImageProcessToolBox/Grayscale.cs

 

文章標籤
全站熱搜
創作者介紹
創作者 Lung-Yu,Tsai 的頭像
Lung-Yu,Tsai

Lung-Yu,Tsai 的部落格

Lung-Yu,Tsai 發表在 痞客邦 留言(0) 人氣(997)