zoukankan      html  css  js  c++  java
  • c#数字图像处理(五)全等级直方图灰度拉伸

    灰度拉伸也属于线性点运算的一种,也可以通过上一节的程序得到。但由于它在点运算的特殊性,所以把它单独列出来进行介绍。

    灰度拉伸定义

    如果一幅图像的灰度值分布在全等级灰度范围内,即在0~255之间,那么它更容易被区别确认出来。

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

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

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

    我们的目标是按照公式   g(x, y)=pf(x,y)+L   ,  把A和B分别线性映射到0和255,因此,最终的图像g(x,y)为:

    private void stretch_Click(object sender, EventArgs e)
            {
                Stretch(curBitmpap, out curBitmpap);
                Invalidate();
            }
    
    
            /// <summary>
            /// 全等级灰度拉伸 (图像增强)
            /// </summary>
            /// <param name="srcBmp">原图像</param>
            /// <param name="dstBmp">处理后图像</param>
            /// <returns>处理成功 true 失败 false</returns>
            public static bool Stretch(Bitmap srcBmp, out Bitmap dstBmp)
            {
                if (srcBmp == null)
                {
                    dstBmp = null;
                    return false;
                }
                double pR = 0.0;//斜率
                double pG = 0.0;//斜率
                double pB = 0.0;//斜率
                byte minGrayDegree = 255;
                byte maxGrayDegree = 0;
                byte minGrayDegreeR = 255;
                byte maxGrayDegreeR = 0;
                byte minGrayDegreeG = 255;
                byte maxGrayDegreeG = 0;
                byte minGrayDegreeB = 255;
                byte maxGrayDegreeB = 0;
                dstBmp = new Bitmap(srcBmp);
                Rectangle rt = new Rectangle(0, 0, dstBmp.Width, dstBmp.Height);
                BitmapData bmpData = dstBmp.LockBits(rt, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
    
                unsafe
                {
                    for (int i = 0; i < bmpData.Height; i++)
                    {
                        byte* ptr = (byte*)bmpData.Scan0 + i * bmpData.Stride;
                        for (int j = 0; j < bmpData.Width; j++)
                        {
                            if (minGrayDegreeR > *(ptr + j * 3 + 2))
                                minGrayDegreeR = *(ptr + j * 3 + 2);
                            if (maxGrayDegreeR < *(ptr + j * 3 + 2))
                                maxGrayDegreeR = *(ptr + j * 3 + 2);
                            if (minGrayDegreeG > *(ptr + j * 3 + 1))
                                minGrayDegreeG = *(ptr + j * 3 + 1);
                            if (maxGrayDegreeG < *(ptr + j * 3 + 1))
                                maxGrayDegreeG = *(ptr + j * 3 + 1);
                            if (minGrayDegreeB > *(ptr + j * 3))
                                minGrayDegreeB = *(ptr + j * 3);
                            if (maxGrayDegreeB < *(ptr + j * 3))
                                maxGrayDegreeB = *(ptr + j * 3);
                        }
                    }
                    pR = 255.0 / (maxGrayDegreeR - minGrayDegreeR);
                    pG = 255.0 / (maxGrayDegreeG - minGrayDegreeG);
                    pB = 255.0 / (maxGrayDegreeB - minGrayDegreeB);
                    for (int i = 0; i < bmpData.Height; i++)
                    {
                        byte* ptr1 = (byte*)bmpData.Scan0 + i * bmpData.Stride;
                        for (int j = 0; j < bmpData.Width; j++)
                        {
                            *(ptr1 + j * 3) = (byte)((*(ptr1 + j * 3) - minGrayDegreeB) * pB + 0.5);
                            *(ptr1 + j * 3 + 1) = (byte)((*(ptr1 + j * 3 + 1) - minGrayDegreeG) * pG + 0.5);
                            *(ptr1 + j * 3 + 2) = (byte)((*(ptr1 + j * 3 + 2) - minGrayDegreeR) * pR + 0.5);
                        }
                    }
                }
                dstBmp.UnlockBits(bmpData);
                return true;
            }

    增强后:

  • 相关阅读:
    汉堡博客
    复利计算——结对1.0
    《构建之法》第4章读后感
    Compound Interest Calculator4.0
    实验一 命令解释程序的编写
    Compound Interest Calculator3.0续
    1203正规式转换为有穷自动机
    优缺点评价
    语文文法
    词法分析实验总结
  • 原文地址:https://www.cnblogs.com/dearzhoubi/p/8624800.html
Copyright © 2011-2022 走看看