全等级直方图灰度拉伸

来源:互联网 发布:网络防诈骗的班会 编辑:程序博客网 时间:2024/06/05 23:54

灰度拉伸属于线性点运算的一种。灰度拉伸。也称对比度拉伸,是一种简单的线性点运算。它扩展图像的直方图,使其充满整个灰度级范围内。

设f(x,y)为输入图像,它的最小灰度级A和最大灰度级B的定义,如下:

A = min[f(x,y)]    B = max[f(x,y)]

将A和B分别线性映射到0和255,最终得到的图像g(x,y)为:

以下为源代码(C#实现)

[csharp] view plain copy
  1. /// <summary>  
  2.    /// 全等级灰度拉伸  
  3.    /// </summary>  
  4.    /// <param name="srcBmp">原图像</param>  
  5.    /// <param name="dstBmp">处理后图像</param>  
  6.    /// <returns>处理成功 true 失败 false</returns>  
  7.    public static bool Stretch(Bitmap srcBmp, out Bitmap dstBmp) {  
  8.        if (srcBmp == null) {  
  9.            dstBmp = null;  
  10.            return false;  
  11.        }  
  12.        double pR = 0.0;//斜率  
  13.        double pG = 0.0;//斜率  
  14.        double pB = 0.0;//斜率  
  15.        byte minGrayDegree = 255;  
  16.        byte maxGrayDegree = 0;  
  17.        byte minGrayDegreeR = 255;  
  18.        byte maxGrayDegreeR = 0;  
  19.        byte minGrayDegreeG = 255;  
  20.        byte maxGrayDegreeG = 0;  
  21.        byte minGrayDegreeB = 255;  
  22.        byte maxGrayDegreeB = 0;  
  23.        dstBmp = new Bitmap(srcBmp);  
  24.        Rectangle rt = new Rectangle(0, 0, dstBmp.Width, dstBmp.Height);  
  25.        BitmapData bmpData = dstBmp.LockBits(rt, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);  
  26.        unsafe {  
  27.            for (int i = 0; i < bmpData.Height; i++) {  
  28.                byte* ptr = (byte*)bmpData.Scan0 + i * bmpData.Stride;  
  29.                for (int j = 0; j < bmpData.Width; j++) {  
  30.                    if (minGrayDegreeR > *(ptr + j * 3 + 2))  
  31.                        minGrayDegreeR = *(ptr + j * 3 + 2);  
  32.                    if (maxGrayDegreeR < *(ptr + j * 3 + 2))  
  33.                        maxGrayDegreeR = *(ptr + j * 3 + 2);  
  34.                    if (minGrayDegreeG > *(ptr + j * 3 + 1))  
  35.                        minGrayDegreeG = *(ptr + j * 3 + 1);  
  36.                    if (maxGrayDegreeG < *(ptr + j * 3 + 1))  
  37.                        maxGrayDegreeG = *(ptr + j * 3 + 1);  
  38.                    if (minGrayDegreeB > *(ptr + j * 3))  
  39.                        minGrayDegreeB = *(ptr + j * 3);  
  40.                    if (maxGrayDegreeB < *(ptr + j * 3))  
  41.                        maxGrayDegreeB = *(ptr + j * 3);  
  42.                }  
  43.            }  
  44.            pR = 255.0 / (maxGrayDegreeR - minGrayDegreeR);  
  45.            pG = 255.0 / (maxGrayDegreeG - minGrayDegreeG);  
  46.            pB = 255.0 / (maxGrayDegreeB - minGrayDegreeB);  
  47.            for (int i = 0; i < bmpData.Height; i++) {  
  48.                byte* ptr1 = (byte*)bmpData.Scan0 + i * bmpData.Stride;  
  49.                for (int j = 0; j < bmpData.Width; j++) {  
  50.                    *(ptr1 + j * 3) = (byte)((*(ptr1 + j * 3) - minGrayDegreeB) * pB + 0.5);  
  51.                    *(ptr1 + j * 3 + 1) = (byte)((*(ptr1 + j * 3 + 1) - minGrayDegreeG) * pG + 0.5);  
  52.                    *(ptr1 + j * 3 + 2) = (byte)((*(ptr1 + j * 3 + 2) - minGrayDegreeR) * pR + 0.5);  
  53.                }  
  54.            }  
  55.        }  
  56.        dstBmp.UnlockBits(bmpData);  
  57.        return true;  
  58.    }  
效果图: