原文:Win8Metro(C#)数字图像处理--2.30直方图均衡化

[函数名称]

直方图均衡化函数HistogramEqualProcess(WriteableBitmap src)

[算法说明]

  直方图均衡化,又叫做直方图修平,是对图像进行非线性拉伸,重新分配图像像素值,把原始图像的灰度直方图从比较集中的某个灰度区间转换为全部灰度范围内的均匀分布,这样就增加了像素灰度值的动态范围,达到增强图像整体对比度的效果。

[函数代码]

        /// <summary>

        /// Histogram equalization process.

        /// </summary>

        /// <param name="src">The source image.</param>

        /// <returns></returns>

        public static WriteableBitmap HistogramEqualProcess(WriteableBitmap src)////30图像直方图均衡化

        {

            if (src != null)

            {

                int w = src.PixelWidth;

                int h = src.PixelHeight;

                WriteableBitmap histogramEqualImage = new WriteableBitmap(w, h);

                byte[] temp = src.PixelBuffer.ToArray();

                byte gray;

                int[] tempArray = new int[256];

                int[] countPixel = new int[256];

                byte[] pixelMap = new byte[256];

                for (int i = 0; i < temp.Length; i += 4)

                {

                    gray = (byte)(temp[i] * 0.114 + temp[i + 1] * 0.587 + temp[i + 2] * 0.299);

                    countPixel[gray]++;

                }

                for (int i = 0; i < 256; i++)

                {

                    if (i != 0)

                    {

                        tempArray[i] = tempArray[i - 1] + countPixel[i];

                    }

                    else

                    {

                        tempArray[0] = countPixel[0];

                    }

                    pixelMap[i] = (byte)(255 * tempArray[i] * 4 / temp.Length + 0.5);

                }

                for (int i = 0; i < temp.Length; i+=4)

                {

                    gray = temp[i];

                    temp[i] = pixelMap[gray];

                    gray = temp[i+1];

                    temp[i+1] = pixelMap[gray];

                    gray = temp[i+2];

                    temp[i+2] = pixelMap[gray];

                }

                Stream sTemp = histogramEqualImage.PixelBuffer.AsStream();

                sTemp.Seek(0, SeekOrigin.Begin);

                sTemp.Write(temp, 0, w * 4 * h);

                return histogramEqualImage;

            }

            else

            {

                return null;

            }         

        }

[图像效果]

Win8Metro(C#)数字图像处理--2.30直方图均衡化的更多相关文章

  1. Win8Metro(C#)数字图像处理--2.34直方图规定化

    原文:Win8Metro(C#)数字图像处理--2.34直方图规定化  [函数名称] WriteableBitmap HistogramSpecificateProcess(WriteableBi ...

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

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

  3. Win8Metro(C#)数字图像处理--2.33图像非线性变换

    原文:Win8Metro(C#)数字图像处理--2.33图像非线性变换  [函数名称] 图像非线性变换函数NonlinearTransformProcess(WriteableBitmap src ...

  4. Win8Metro(C#)数字图像处理--2.32图像曝光算法

    原文:Win8Metro(C#)数字图像处理--2.32图像曝光算法  [函数名称] 图像曝光函数ExposureProcess(WriteableBitmap src,int exposureV ...

  5. Win8Metro(C#)数字图像处理--2.27图像加法运算

    原文:Win8Metro(C#)数字图像处理--2.27图像加法运算  [函数名称] 图像加法函数AddProcess(WriteableBitmap src, WriteableBitmap a ...

  6. Win8Metro(C#)数字图像处理--2.28图像乘法运算

    原文:Win8Metro(C#)数字图像处理--2.28图像乘法运算  [函数名称] 图像乘法函数MultiplicationProcess(WriteableBitmap src, Writea ...

  7. Win8Metro(C#)数字图像处理--2.29图像除法运算

    原文:Win8Metro(C#)数字图像处理--2.29图像除法运算  [函数名称] 图像除法函数DivisionProcess(WriteableBitmap src, WriteableBit ...

  8. Win8Metro(C#)数字图像处理--2.26图像减法

    原文:Win8Metro(C#)数字图像处理--2.26图像减法  [函数名称] 图像减法函数SubtractionProcess(WriteableBitmap src, WriteableBi ...

  9. Win8Metro(C#)数字图像处理--2.25二值图像距离变换

    原文:Win8Metro(C#)数字图像处理--2.25二值图像距离变换  [函数名称] 二值图像距离变换函数DistanceTransformProcess(WriteableBitmap sr ...

随机推荐

  1. protobuf入门教程

    1.简介和安装 2.消息类型 3.proto3 与 proto2 的区别 4.常用序列化/反序列化接口 5.repeated限定修饰符 6.枚举(enum).包(package) 7.导入定义(imp ...

  2. PHP怎么读写XML?(四种方法)

    PHP怎么读写XML?(四种方法) 一.总结 1.这四种方法中,字符串的方式是最原始的方法.SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内 ...

  3. 搭建微信小程序开发环境

    1.下载开发工具 点击进入下载地址选择和自己电脑匹配的安装包,并安装: image.png 安装完成后出现应用icon: image.png 2.创建项目 能够扫码登录的前提是微信号已经注册了小程序, ...

  4. java十五个常用类学习及方法举例

    <code class="language-java">import java.util.Scanner; import java.util.Properties; i ...

  5. erlang lists

    http://blog.csdn.net/dp0304/article/details/7590233 一,带函数Pred1, all(Pred, List) -> boolean()如果Lis ...

  6. NOIP2016 天天爱跑步 - 树上差分

    传送门 题目分析: 一年前还是个傻子的时候居然直接放弃了这题. 首先列出两个方程:如果i节点的观察员能够观察到由s->t的那个人,那么: \[dep[s] - dep[i] = w[i], de ...

  7. LUOGU 1137 - 拓扑排序

    传送门 题目分析 拓扑排序:将图从度为0的点不断的剥掉外层的点,即可得到拓扑序,再按照拓扑序进行一遍简单的dp. code #include<bits/stdc++.h> using na ...

  8. 【Sliding Window】单调队列

    题目描述 给你一个长度为 N 的数组,一个长为 K 的滑动的窗体从最左移至最右端,你只能见到窗口的 K 个整数,每次窗体向右移动一位,如下表:

  9. C# 程序内的类数量对程序启动的影响

    原文:C# 程序内的类数量对程序启动的影响 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee.i ...

  10. C-order/Fortran-order(Row-/Column-major order)

    1. row-major / column-major order 无论是行序优先还是列序优先,其实在计算机计算中,指的都是在线性空间(linear storage,如 RAM,也即连续内存存储 co ...