文档章节

PS色调均化滤镜的快捷实现(C#源代码)。

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:41
字数 658
阅读 3
收藏 0
点赞 0
评论 0

  photoshop色调均化功能通常是在进行修片处理前期比较常用的功能之一,其对扩展图像的对比度,增强视觉效果有一定的作用。在很多课本或者文章中,也称这种处理为灰度均衡化、直方图均衡化等等。算法原理都是对原始图像统计其直方图,然后通过累计分布函数,重新隐射直方图数据,使每个色阶的的分布概率都往一致的方向调整。我看到的网络上的代码,抑或是一些教材中的代码,对这个过程的描述都是相当的冗余,要么是代码累赘,效率低下,要么是萝莉啰唆,很是难受。

   在给出我的代码之前,还需要说明一些问题。对于灰度图像,由于只有一个通道,这个问题不明显,对于常见的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

 

本文转载自:http://www.cnblogs.com/Imageshop/p/3139209.html

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6195
码字总数 1876
作品 0
深圳
项目经理
[发布] Photoshop 油画效果滤镜

    【原创性声明】本滤镜是我采用 PS SDK 开发而成,而滤镜的算法具体是由谁提出的可能不详,我是参考了 FilterExplorer 的源码(VC 6),本算法的主要参考来源是该项目中的 Filters.cp...

hoodlum1980 ⋅ 2011/01/15 ⋅ 0

MichaelJou/AlloyImage

AlloyImage - 基于HTML5技术的专业图像处理库 功能特性 ####强大功能 基于多图层操作 -- 一个图层的处理不影响其他图层 与PS对应的17种图层混合模式 -- 便于PS处理教程的无缝迁移 多种基本滤...

MichaelJou ⋅ 2017/09/04 ⋅ 0

Android 相机软件--MagicCamera

MagicCamera 是 Android 平台开源相机项目,具有包括实时美颜等40种实时滤镜,功能包括对图片进行磨皮/美白等后期处理。 1.相机预览模式 示例见:com.seu.magiccamera.activity.CameraActivi...

吴昊雨 ⋅ 2016/01/22 ⋅ 2

深度学习AI美颜系列---AI滤镜特效算法

滤镜是图像美化中必不可少的步骤, 所谓滤镜,最初是指安装在相机镜头前过滤自然光的附加镜头,用来实现调色和添加效果。我们做的滤镜算法又叫做软件滤镜,是对大部分镜头滤镜进行的模拟,当...

trent1985 ⋅ 05/25 ⋅ 0

解决文字和text-decoration:underline下划线重叠问题

解决文字和text-decoration:underline下划线重叠问题 张鑫旭-鑫空间-鑫生活2016-11-2240 阅读 box-shadowgradientcanvasfilterborder by zhangxinxu from http://www.zhangxinxu.com/wordpr......

张鑫旭-鑫空间-鑫生活 ⋅ 2016/11/22 ⋅ 0

对Photoshop第三方滤镜插件开发的简介

Photoshop是数字图像处理领域内的杰出软件。同时,它也允许第三方以插件(Plugin) 的形式扩展其功能。Photoshop的插件目前一共可分为以下九种:自动化(批处理)(出现在‘自动’子菜单下),...

hoodlum1980 ⋅ 2008/02/28 ⋅ 0

python图形处理库PIL(Python Image Library)(zz)

关于PIL库的一些概念   pil能处理的类型   pil可以处理光栅图片(像素数据组成的的块)。   通道   一个图片可以包含一到多个数据通道,如果这些通道具有相同的维数和深度,Pil允许将这...

Neo_ ⋅ 2012/11/22 ⋅ 0

你所不知道的 CSS 滤镜技巧与细节

承接上一篇你所不知道的 CSS 动画技巧与细节,本文主要介绍 CSS 滤镜的不常用用法,希望能给读者带来一些干货! 系列 CSS 文章汇总在我的 Github ,持续更新,欢迎点个 star 订阅收藏。 OK,...

chokcoco ⋅ 2017/09/14 ⋅ 0

巧用CSS的BlendTrans滤镜

作者:冯永曜 BlendTrans滤镜比起上一篇介绍的Revealtrans滤镜来要简单一些,它只有一个参数:Duration 变换时间,它的功能也比较单一,就是产生一种淡入淡出的效果,不过它的这种效果比起R...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

巧用CSS的RevealTrans滤镜

作者: 冯永曜 矩形从大至小 0 随机溶解 12 矩形从小至大 1 从上下向中间展开 13 圆形从大至小 2 从中间向上下展开 14 圆形从小至大 3 从两边向中间展开 15 向上推开 4 从中间向两边展开 16...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 23分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 25分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 36分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 38分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 40分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 41分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 今天 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部