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

灰度拉伸定义

如果一幅图像的灰度值分布在全等级灰度范围内,即在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 = ;
byte maxGrayDegree = ;
byte minGrayDegreeR = ;
byte maxGrayDegreeR = ;
byte minGrayDegreeG = ;
byte maxGrayDegreeG = ;
byte minGrayDegreeB = ;
byte maxGrayDegreeB = ;
dstBmp = new Bitmap(srcBmp);
Rectangle rt = new Rectangle(, , dstBmp.Width, dstBmp.Height);
BitmapData bmpData = dstBmp.LockBits(rt, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); unsafe
{
for (int i = ; i < bmpData.Height; i++)
{
byte* ptr = (byte*)bmpData.Scan0 + i * bmpData.Stride;
for (int j = ; j < bmpData.Width; j++)
{
if (minGrayDegreeR > *(ptr + j * + ))
minGrayDegreeR = *(ptr + j * + );
if (maxGrayDegreeR < *(ptr + j * + ))
maxGrayDegreeR = *(ptr + j * + );
if (minGrayDegreeG > *(ptr + j * + ))
minGrayDegreeG = *(ptr + j * + );
if (maxGrayDegreeG < *(ptr + j * + ))
maxGrayDegreeG = *(ptr + j * + );
if (minGrayDegreeB > *(ptr + j * ))
minGrayDegreeB = *(ptr + j * );
if (maxGrayDegreeB < *(ptr + j * ))
maxGrayDegreeB = *(ptr + j * );
}
}
pR = 255.0 / (maxGrayDegreeR - minGrayDegreeR);
pG = 255.0 / (maxGrayDegreeG - minGrayDegreeG);
pB = 255.0 / (maxGrayDegreeB - minGrayDegreeB);
for (int i = ; i < bmpData.Height; i++)
{
byte* ptr1 = (byte*)bmpData.Scan0 + i * bmpData.Stride;
for (int j = ; j < bmpData.Width; j++)
{
*(ptr1 + j * ) = (byte)((*(ptr1 + j * ) - minGrayDegreeB) * pB + 0.5);
*(ptr1 + j * + ) = (byte)((*(ptr1 + j * + ) - minGrayDegreeG) * pG + 0.5);
*(ptr1 + j * + ) = (byte)((*(ptr1 + j * + ) - minGrayDegreeR) * pR + 0.5);
}
}
}
dstBmp.UnlockBits(bmpData);
return true;
}

增强后:

c#数字图像处理(五)全等级直方图灰度拉伸的更多相关文章

  1. Win8 Metro(C#)数字图像处理--3.3图像直方图计算

    原文:Win8 Metro(C#)数字图像处理--3.3图像直方图计算 /// <summary> /// Get the array of histrgram. /// </sum ...

  2. 数字图像处理(一)之灰度转换和卷积python实现

    使用Python实现数字图像处理中如下功能: 彩色图像转成灰度图像 实现图像的相关&卷积操作 实现图像的高斯核卷积 使用的库和python版本如下: imageio:2.9.0 用于读取磁盘中 ...

  3. c#数字图像处理(六)直方图均衡化

    直方图均衡化又称直方图修平,是一种很重要的非线性点运算.使用该方法可以加强图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候.通过这种方法,亮度可以更好的在直方图上分布. 直方图均衡化的基 ...

  4. c#数字图像处理(二)彩色图像灰度化,灰度图像二值化

    为加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像,在灰度图像上得到验证的算法,很容易移植到彩色图像上.24位彩色图像每个像素用3个字节表示,每个字节对应着R.G.B分量的亮度(红.绿 ...

  5. c#数字图像处理(七)直方图匹配

    直方图匹配,又称直方图规定化,即变换原图的直方图为规定的某种形式的直方图,从而使两幅图像具有类似的色调和反差.直方图匹配属于非线性点运算. 直方图规定化的原理:对两个直方图都做均衡化,变成相同的归一化 ...

  6. Win8Metro(C#)数字图像处理--2.31灰度拉伸算法

    原文:Win8Metro(C#)数字图像处理--2.31灰度拉伸算法  [函数名称] 灰度拉伸函数GrayStretchProcess(WriteableBitmap src) [算法说明]    ...

  7. 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理具体解释

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行解说.主要通过MFC单文档视图实现显示BMP图片点运算处理.包含图像灰度线性变换 ...

  8. OpenCV-跟我一起学数字图像处理之直方图均衡化

    从这篇博文开始,小生正式从一个毫不相干专业转投数字图像处理.废话不多说了,talk is cheap. show me the code. 直方图均衡化目的 由于一些图像灰度的分布过于集中,这样会导致 ...

  9. Win8Metro(C#)数字图像处理--2.30直方图均衡化

    原文:Win8Metro(C#)数字图像处理--2.30直方图均衡化 [函数名称] 直方图均衡化函数HistogramEqualProcess(WriteableBitmap src) [算法说明] ...

随机推荐

  1. linux包之dracut

    这是一个工具类,不是一个后台服务类 centos7.2-minimal就下面三个包 [root@1st-kvm ~]# rpm -qa|grep dracutdracut-config-rescue- ...

  2. jdbc的URL配置

    Microsoft SQL ServerMicrosoft SQL Server JDBC Driver (一般用来连接 SQLServer 2000)驱动程序包名:msbase.jar mssqls ...

  3. Asp.NetCore3.1版本的CodeFirst与经典的三层架构与AutoFac批量注入

    Core3.1 CodeFirst与AutoFac批量注入(最下面附GitHub完整 Demo,由于上传网速较慢,这里就直接压缩打包上传了) ===Core3.1 CodeFirst 数据库为远程阿里 ...

  4. [Ljava.lang.String;@3e5084c9:是一个字符串数组的字节码表示

    [Ljava.lang.String;@3e5084c9:是一个字符串数组的字节码表示 打印一个字符串数组的话,会发现 String[] arr = new String[10]; // String ...

  5. 微信小程序map地图的一些使用注意事项

    1.小程序组件map,在微信7.0.4以上(不包括7.0.4)层级问题官方已作更新,可在map上随意添加任何标签使用z-index即可:微信7.0.4版本以下map组件层级默认是最高的,只能使用官方提 ...

  6. Java高级特性——流

    以上就是这段时间学习完流的知识以后我的总结,.mmap文件可以去我的github上获取:https://github.com/xiaozhengyu/StudyNotes.git

  7. Revealjs网页版PPT让你复制粘贴另类装逼,简洁优雅又低调,不懂编程也看过来

    Revealjs网页版PPT让你复制粘贴另类装逼,简洁优雅又低调,不懂编程也看过来 要了解一个新知识我们可以从三个方面入手:是什么,有什么用,怎么用.下面我们就从这三个方面进行讲解Reveal.js噢 ...

  8. React useEffect的源码解读

    前言 对源码的解读有利于搞清楚Hooks到底做了什么,如果您觉得useEffect很"魔法",这篇文章也许对您有些帮助. 本篇博客篇幅有限,只看useEffect,力求简单明了,带 ...

  9. MongoDB 上手开发实践(入门上手开发这一篇就够了)

    前言 MongoDB是一个介于 关系数据库 和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复 ...

  10. 【JDBC】Java程序的数据库初体验

    JDBC是什么 JDBC是一种能够用来执行SQL语句的Java API[接口]. 它是Java提供的一种规范,让各大数据库厂商遵循此规范完成自己的数据库连接驱动[实现接口]. JDBC的入门程序(这里 ...