彩色圖像灰度化一般有四種方式 :
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
文章標籤
全站熱搜
