PS色调均化滤镜的快捷实现(C#源代码)。
2016-11-22 00:00
330 查看
photoshop色调均化功能通常是在进行修片处理前期比较常用的功能之一,其对扩展图像的对比度,增强视觉效果有一定的作用。在很多课本或者文章中,也称这种处理为灰度均衡化、直方图均衡化等等。算法原理都是对原始图像统计其直方图,然后通过累计分布函数,重新隐射直方图数据,使每个色阶的的分布概率都往一致的方向调整。我看到的网络上的代码,抑或是一些教材中的代码,对这个过程的描述都是相当的冗余,要么是代码累赘,效率低下,要么是萝莉啰唆,很是难受。
在给出我的代码之前,还需要说明一些问题。对于灰度图像,由于只有一个通道,这个问题不明显,对于常见的24位图像,由于有RGB三个通道,那就存在是每个通道都单独均衡还是三通道联合计算直方图,然后利用相同的映射表在隐射RGB数据了,经过我的测试,在Photoshop中,是取的后者。
算法部分就是这么简单的二十几行代码,代码清晰,执行效率又特别高,数码相机中常见的4000*3000的照片100ms内就可以处理完。
一副图像如果执行了一次色调均化,那么再次执行色调均化应该不会有任何像素发生变换了。
从广义上讲,色调均化可以看成是直方图匹配的一个特例,即匹配的直方图分布为一条水平线。
一些书中的色调均化是对各通道分别进行校正的,似乎这样处理的效果容易导致图像整体颜色不搭配,比如经典的Lena图:
原图 PS的色调均化 郎锐课本上的效果
C#版色调均化代码:http://files.cnblogs.com/Imageshop/HistGramEqualize.rar
在给出我的代码之前,还需要说明一些问题。对于灰度图像,由于只有一个通道,这个问题不明显,对于常见的24位图像,由于有RGB三个通道,那就存在是每个通道都单独均衡还是三通道联合计算直方图,然后利用相同的映射表在隐射RGB数据了,经过我的测试,在Photoshop中,是取的后者。
for (Y = 0; Y < Height; Y++) { Pointer = Scan0 + Y * Stride; // 定位到每个扫描行的第一个像素,以避免溶于数据的影响 for (X = 0; X < Width; X++) { HistGram[*Pointer]++; // Blue HistGram[*(Pointer + 1)]++; // Green HistGram[*(Pointer + 2)]++; // Red Pointer += 3; // 移向下一个像素 } } Num = 0; for (Y = 0; Y < 256; Y++) { Num = Num + HistGram[Y]; Lut[Y] = (byte)((float)Num / (Width * Height * 3) * 255); // 计算映射表 } for (Y = 0; Y < Height; Y++) { Pointer = Scan0 + Y * Stride; for (X = 0; X < Width * 3; X += 3) // 也可以这样写 { Pointer[X] = Lut[Pointer[X]]; Pointer[X + 1] = Lut[Pointer[X + 1]]; Pointer[X + 2] = Lut[Pointer[X + 2]]; } }
算法部分就是这么简单的二十几行代码,代码清晰,执行效率又特别高,数码相机中常见的4000*3000的照片100ms内就可以处理完。
一副图像如果执行了一次色调均化,那么再次执行色调均化应该不会有任何像素发生变换了。
从广义上讲,色调均化可以看成是直方图匹配的一个特例,即匹配的直方图分布为一条水平线。
一些书中的色调均化是对各通道分别进行校正的,似乎这样处理的效果容易导致图像整体颜色不搭配,比如经典的Lena图:
原图 PS的色调均化 郎锐课本上的效果
C#版色调均化代码:http://files.cnblogs.com/Imageshop/HistGramEqualize.rar
相关文章推荐
- PS色调均化滤镜的快捷实现(C#源代码)。
- c#中在DataGrid里创建一个弹出式窗口------可实现源代码
- 用C#实现的图象处理(源代码)------正在更新中!
- C#实现更改IP功能源代码
- 使用正则表达式实现的语法分析引擎(C#源代码)
- 矩阵基本操作的实现(C# 源代码)
- C#中实现WebBrowser控件的HTML源代码读写
- C#操作注册表 实现快捷启动程序
- c#中异步基于消息通信的完成端口的TCP/IP协议的组件实现(源代码)
- 用C#实现获取文件夹大小的源代码(收藏)
- c#中异步基于消息通信的完成端口的TCP-IP协议的组件实现(服务器端-源代码)
- c#中在DataGrid里创建一个弹出式窗口------可实现源代码
- 用 C# 实现的一个队列源代码
- 用 C# 实现的一个队列源代码
- C#实现更改IP功能源代码
- 求C#源代码(实现图形的选中,放大,缩小功能)
- 实现自绘 ComboBox 源代码 (C#)
- 购物车和结算的实现!--c#源代码!
- 用C#实现获取文件夹大小的源代码
- C#中解析Rss实现思路及通用类–源代码