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

灰度拉伸定义

如果一幅图像的灰度值分布在全等级灰度范围内,即在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. 解决html2canvas图片跨域合成失败的问题

    /** * 将图片转换为base64 * 解决html2canvas跨域合成失败的问题 */ var getBase64Image = function(src, cb) { var img = do ...

  2. WPF实现软键盘

    wpf 实现一个软键盘, 先发个图: 工作有需要实现一个软键盘,本来想用windows自带的软键盘凑合凑合得了,又觉得那个软键盘太大了,所以自己实现了一个. 说一下实现的思路,其实没什么思路 界面就是 ...

  3. 使用condition 实现线程顺序执行

    书上给的例子都是ABCABC这种,比较简单,复杂点的如A0B0C0, A0A1A2没有,手动实现下,做个记录 1. A0 A1 A2 A3 public class Demo0 { private s ...

  4. java框架篇---Struts2 本地化/国际化(i18n)(转)

    源地址:https://www.cnblogs.com/oumyye/p/4368453.html 国际化(i18n)是规划和实施的产品和服务,使他们能很容易地适应特定的本地语言和文化的过程中,这个过 ...

  5. centos7靶机获取不到ip

    尝试了好多方法都获取不到靶机ip: 1.首先检查网络链接是否正常 2.重启网卡  /etc/init.d/network restart 3.修改网卡ONBOOT=yes vi /etc/syscon ...

  6. RabbitMQ、Kafka、RocketMQ的优劣势

    今天我们一起来探讨: 全量的消息队列究竟有哪些? Kafka.RocketMQ.RabbitMQ的优劣势比较 以及消息队列的选型 最全MQ消息队列有哪些 那么目前在业界有哪些比较知名的消息引擎呢?如下 ...

  7. The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone错误的解决办法【已解决】

    ---恢复内容开始--- The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time ...

  8. [UWP]XAML中的响应式布局技术

    响应式布局的概念是一个页面适配多个终端及不同分辨率.在针对特定屏幕宽度优化应用 UI 时,我们将此称为创建响应式设计.WPF设计之初响应式设计的概念并不流行,那时候大部分网页设计师都按着宽度960像素 ...

  9. 基于Tesseract的OCR识别小程序

    一.背景 先说下开发背景,今年有次搬家找房子(2020了应该叫去年了),发现每天都要对着各种租房广告打很多电话.(当然网上也找了实地也找),每次基本都是对着墙面看电话号码然后拨打,次数一多就感觉非常麻 ...

  10. U盘中了蠕虫病毒,文件夹都变成exe了,怎么办?

    昨天做实验,用U盘拷了实验室的文件,然后就中了病毒了(无奈),U盘里的文件全都变成了exe.有点慌张,我的U盘里存了很多课程资料.然而,我懒得下载杀毒软件.参考这位博主的做法,我成功的找回了我隐藏的文 ...