直方图修正和彩色变换
颜色校正算法
颜色校正算法一、引言颜色校正算法是计算机图形学中的一个重要技术,旨在修正由于光照、摄像设备、显示器等因素引起的颜色偏差。
在计算机图像处理和计算机视觉领域,颜色校正算法被广泛应用于图像增强、图像重建、色彩匹配等方面。
本文将介绍几种常见的颜色校正算法及其原理。
二、直方图均衡化直方图均衡化是一种简单而有效的颜色校正算法。
它通过对图像的像素值分布进行调整,使图像的亮度分布更加均匀。
具体步骤如下:1. 计算图像的灰度直方图,统计每个像素值的频率。
2. 计算累积直方图,即将每个像素值的频率累加起来。
3. 根据累积直方图,计算每个像素值的映射关系。
4. 将原始图像的每个像素值根据映射关系进行替换,得到校正后的图像。
三、颜色空间转换颜色校正算法中常用的一种方法是进行颜色空间的转换。
最常见的颜色空间是RGB和HSV。
RGB颜色空间由红、绿、蓝三个分量组成,而HSV颜色空间由色相、饱和度和亮度三个分量组成。
通过将图像从RGB颜色空间转换到HSV颜色空间,可以更好地调整图像的色彩和亮度。
具体步骤如下:1. 将RGB图像转换为HSV图像。
2. 根据需要调整HSV图像的色相、饱和度和亮度分量。
3. 将调整后的HSV图像转换回RGB图像。
四、灰度世界假设灰度世界假设是一种基于图像平均亮度的颜色校正方法。
该方法假设图像中的物体颜色在整个图像中具有相同的平均亮度。
具体步骤如下:1. 计算图像的平均亮度,可以根据图像的RGB分量或HSV分量进行计算。
2. 根据计算得到的平均亮度,调整图像的RGB分量或HSV分量,使其平均亮度与整个图像的平均亮度一致。
五、颜色映射颜色映射是一种基于颜色直方图的颜色校正算法。
它将原始图像和目标图像的颜色直方图进行比较,通过调整原始图像的颜色分布来实现校正。
具体步骤如下:1. 计算原始图像和目标图像的颜色直方图,并进行归一化处理。
2. 计算原始图像和目标图像的累积直方图。
3. 根据累积直方图,计算每个像素值的映射关系。
如何使用图像处理技术进行图像的色彩增强和颜色校正
如何使用图像处理技术进行图像的色彩增强和颜色校正图像处理技术在数字图像处理领域中扮演着重要的角色,其中包括了图像的色彩增强和颜色校正。
这些技术能够改善图像的视觉效果和色彩准确性,提高图像品质,并支持许多应用领域,如摄影、印刷、医学图像等。
本文将介绍如何使用图像处理技术进行图像的色彩增强和颜色校正。
我们将讨论图像的色彩增强技术。
色彩增强可以使图像更加鲜艳、生动,并提高视觉效果。
以下是一些常见的色彩增强技术。
1. 色彩平衡:色彩平衡是通过调整图像的色彩分布来改善图像的整体色彩平衡。
主要有三个通道,即红、绿、蓝(RGB)。
通过调整这些通道的比例,可以更好地平衡图像的色彩。
色彩平衡可以通过调整白平衡等参数来实现。
2. 对比度调整:对比度调整是通过改变图像的亮度范围,使得图像的明暗对比更加明显。
这可以通过调整图像的灰度级范围来实现。
增加对比度可以使图像细节更加清晰,增强图像的深度感。
3. 色度饱和度调整:色度饱和度调整可以改变图像中颜色的饱和度。
通过增加或减少颜色的饱和度,可以使图像更加鲜艳或柔和。
这可以通过调整HSL(色相、饱和度、亮度)或HSV(色相、饱和度、值)空间中的参数来实现。
接下来,我们将介绍图像的颜色校正技术。
颜色校正旨在调整图像中的颜色,使其更接近真实场景中的颜色。
以下是一些常见的颜色校正技术。
1. 直方图均衡化:直方图均衡化是一种常用的图像增强方法,它通过调整图像的灰度级分布来改善图像的对比度。
它可以使图像的直方图在整个灰度级范围内均匀分布,从而增强图像的细节和对比度。
2. 色彩映射:色彩映射可以将图像的颜色映射到另一个图像或颜色空间中的对应颜色。
这可以通过使用预定义的颜色映射表或根据特定的颜色映射算法来实现。
色彩映射可以用于将图像从一种颜色空间转换为另一种颜色空间,或者用于改变图像的颜色外观。
3. 基于模型的颜色校正:基于模型的颜色校正方法使用了一个颜色模型,该模型描述了颜色之间的关系。
使用图像处理技术实现图像颜色平衡的方法
使用图像处理技术实现图像颜色平衡的方法图像颜色平衡是指对图像中的色彩进行调整,使得图像的整体色彩分布均匀、自然。
图像颜色平衡是图像处理中的重要任务之一,通过调整图像的色彩信息,可以改变图像的色调和色彩平衡,使得图像更加美观和逼真。
在图像处理中,有多种方法可以实现图像颜色平衡,本文将介绍其中的几种常见方法。
1. 直方图均衡化直方图均衡化是一种常用的图像增强方法,用于将图像中的像素值分布均匀化,从而增强图像的对比度和亮度。
在直方图均衡化中,首先计算图像的灰度直方图,然后对图像的每个像素值进行映射,使得像素值的分布更加均匀。
通过直方图均衡化,可以改善图像的细节和对比度,进而提高图像的视觉效果。
2. 色彩校正色彩校正是一种通过调整图像的颜色通道来实现图像颜色平衡的方法。
根据图像的特点,对图像的颜色通道进行增强或减少,从而改变图像的整体色彩分布。
常见的色彩校正方法包括RGB色彩模型中的颜色增强,通过调整每个像素点在红、绿、蓝三个通道上的亮度值,使得图像的整体色彩更加均衡。
3. 白平衡算法白平衡是图像处理中重要的一项技术,它通过消除图像中的色温偏差,使得图像中的白色区域呈现真实的白色。
白平衡算法的目标是校正图像中的颜色温度偏差,将图像中的白色区域调整为真实的白色。
常用的白平衡算法包括基于灰度世界假设的算法、基于白点假设的算法和基于场景分析的算法。
4. 色彩梯度映射色彩梯度映射是一种通过改变图像中的色彩梯度来实现图像颜色平衡的方法。
该方法通过调整图像中的色彩梯度分布,使得不同区域的颜色过渡更加自然和平滑。
色彩梯度映射方法可以提高图像的细节和对比度,使得图像更加生动和鲜艳。
5. 色彩校准色彩校准是一种通过调整图像的颜色空间或色彩分布来实现图像颜色平衡的方法。
通过建立颜色标准或参考颜色,对图像进行校准和调整,使得图像中的颜色更加准确展现真实的颜色。
色彩校准可以用于纠正图像中的色差,提高图像的色彩还原能力。
综上所述,图像颜色平衡可以通过直方图均衡化、色彩校正、白平衡算法、色彩梯度映射和色彩校准等方法来实现。
遥感影像直方图修正及彩色变换
化级 别少一 点 , 就可实 现图像信 息 的压缩 , R、 而 G、 B3 分量 同等重 要 , 谁 都不 行 , 以做不 到这 一 个 缺 所
点 yU 和 R B 之 间 有如 下 的 对 应 关 系 G
原 图 的灰 厦恒
围 2 对 比 麈 扩 展 原 理
[
.
y U VJ= 【 j .8 —0 2 9 —0 5 5l R G BJ 0 5 7 .8 .1
增 强 对 比度 的 目 的 。
图 2中的横坐标 gl o d表示原 图 的灰 度值 , 纵坐 值 。n, , b c为 三 段 直 线 的 斜 率 , 为是 对 比度 扩 因
如 图 3 示 , 中横 坐标 表示 灰度值 , 所 其 纵坐 标表 在 程序 中, 函数 SaHiorml () 计直 方 tt s ga Mo 统 t
2 3 真 彩 圈 转 2 6色 圈 5
[5 2 5一b g l2一g l 1 J ( d o o ) d “ 一 [5 2 5一( z2一gl1] o gd od ) 要注 意的是 , 出 的 3个参 数 必 须满 足 两 个条 给 件 : ( l 2 o 1≤2 5 ( od 一g l 1≤ 2 5 b g d 一g l ) 5 ;g z o d ) 5 。 o d 2
.
r2 — - 8 0 l Ⅱ, , , odl g / 2这 5个参 数 , 0 9 0l — ・5 6 c g l , o, -9 4 6] / 由于新 图 的 灰度
U 5 所 14 047 —010 级 也受 2 5约 束 , 以满足 方程 1 .3 .0J
l 1 ] r l
维普资讯
维普资讯
西 安工 程 学 院 学报
色彩校正和调整
色彩校正和调整色彩校正和调整在图像处理和设计中扮演着重要的角色。
它可以改善图像的视觉效果,使色彩更加真实、鲜明,从而提升观看者的视觉体验。
在本文中,我们将探讨色彩校正和调整的概念、方法和应用。
一、概念色彩校正是指通过调整和修正图像的色彩参数,使其与实际场景或预期效果更加接近。
它可以涉及到亮度、对比度、饱和度、色调等多个方面的调整。
而色彩调整则是指对图像的色彩进行修正和改变,以达到设计、艺术或个人喜好的目的。
二、方法1. 直方图调整直方图是图像中灰度级别分布的统计图,可以用来分析图像的色彩分布情况。
通过直方图调整可以改变图像的亮度、对比度和色调。
具体方法包括:- 亮度调整:通过调整曲线在直方图上的位置,增加或减少图像的亮度;- 对比度调整:通过拉伸直方图中的对比度范围,增加或减少图像的对比度;- 色调调整:通过调整直方图中不同色彩通道的分布,改变图像的色调。
2. 色彩平衡调整色彩平衡调整可以改变图像中不同色彩通道的分布,使得整个图像的色彩更加均衡。
具体方法包括:- 色阶调整:通过调整图像中不同灰度级别的亮度,改变图像整体的色彩平衡;- 色相饱和度调整:通过调整不同色彩通道的饱和度,增加或减少图像的颜色鲜艳程度。
3. 色彩校正工具现代图像处理软件提供了多种色彩校正工具,可以简化和加速色彩校正的过程。
其中一些常见的工具包括:- 色彩平衡工具:通过滑动条调整不同色彩通道的分布;- 曲线工具:可以直接调整直方图曲线,改变亮度和对比度;- 色相/饱和度工具:通过调整色相、饱和度和亮度的值,改变图像的色彩效果。
三、应用色彩校正和调整广泛应用于各行各业,包括摄影、电影制作、广告设计等。
以下是一些具体的应用场景:1. 摄影后期处理在摄影中,由于光线、相机参数等各种因素的影响,拍摄出来的照片可能存在色彩偏差或不理想的情况。
通过色彩校正和调整,可以使照片的色彩更加真实、自然。
2. 影视特效制作在电影、电视剧等影视作品的制作中,色彩校正和调整可以用来营造不同的视觉效果,增强故事情节的表现力。
第三章:修饰和修复扩充--使用直方图分析图像色彩
使用直方图分析图像色彩在Photoshop中,使用“直方图”调板,可以科学直观的观察和分析图像中的色彩,“直方图”以图形的形式显示了图像像素在各个色调区的分布情况,通过显示图像在暗调、中间调和高光区域是否包含足够的细节,以便进行更好的校正。
1. 认识“直方图”调板(1)执行“文件”→“打开”命令,将素材“自然景.tif”文件打开。
(2)执行“窗口”→“直方图”命令,即可将“直方图”调板打开。
(3)认识“直方图”调板界面。
(4)将直方图以“全部通道视图”模式显示。
(5)将直方图以“扩展视图”模式显示。
(6)为便于观察,我们可以将直方图以单一的黑色显示。
(6)将鼠标指针放置在直方图上某一处,就可显示该处的信息(7)在直方图中拖动鼠标选择一个区域,可在其下方显示该区域的信息。
(8)若在直方图内绘制选区,直方图将只显示该选区内的图像像素在各个色调区的分布情况2. 通过“直方图”分析图像色彩(1)将素材“人物1.tif”文件打开。
分析“直方图”,图像像素主要分部在调板右侧,也就是亮色调区域的图像像素较多,而左侧即暗部区域几乎没有图像像素。
(2)通过直方图我们可以知道,该图像整体偏亮,缺少黑色像素,从而使亮部细节损失较大,此类图片除非特殊需要,否则我们可以认为为一张曝光过度图像。
(3)打开素材“外景tif”文件。
分析“直方图”,图像像素集中在调板左侧,也就是暗部区域,亮部区域几乎没有图像像素。
(4)通过直方图我们可以知道,图像暗部的细节损失较大,图像亮度不足。
我们可以认为是曝光不足图片。
(5)打开素材“人物2.tif”文件打开,分析“直方图”,图像像素集中在中间部分,即中间色调的图像像素包含较多。
(6)通过直方图我们可以知道,图像效果表现为反差过低,层次减少,画面发灰。
(7)打开“人物3.tif”文件,观察“直方图”调板,图像像素在左右两侧的分布较多,即亮部和暗部图像像素较多,中间部分图像像素分布较少。
(8)通过直方图我们可以知道,图像的画面效果表现为反差较高,对比比较强烈,这样的图像会丢失很多细节。
对直方图的彻底了解.调色必看
对直方图的彻底了解.调色必看:a15出自作者:破法者教程来源:photos对直方图的彻底了解.调色必看点直方图右上的小三角.(全部通道视图)现在大家都看到了...一组很详细的数据.RGB,红,绿,蓝通道的色阶直方图.我现在要说说理论知识,大家不要嫌弃我罗索,因为相当有用!对于左边的一组数据,我必须解释一下:平均值:其中显示图像亮度的平均值.(亮度/饱和度)标准偏差(Std Dev):该值越小,所有象素的色调分布越靠近平均值.中值:显示象素颜色值的中点值.(色相/饱和度)象素:显示象素的总数.而右边的那组数据是鼠标定位查看信息的.一般大家都会用吧,这里是写看直方图的,所以这里不说明了.我还是用昨天的素材...先说一下知识:色调从0~255,0为黑色,255为白色.128为灰色.0~85为暗部,86~170为中间调,171~255为高光区得!先看各个直方图和其数据由R,G,B,亮度,颜色的直方图知道.(可以把128看为为平均的数值)--可以看直方图下面的数据也可以直接看直方图平均值(亮度/对比度)红色通道为111偏低一点,而绿色和蓝色通道的数值较低,其中蓝色最为突出.亮度和颜色也是偏低.按绿色为标准,(不要担心绿色也缺省,一会会调整)所以照片颜色偏红,缺蓝色.再看中间值(色相/饱和度),各直方图都低于80,证明颜色也集中在暗部,所以图片偏暗...知道原因了...我们开始调色了...先调蓝色通道,图层--调整--色阶(蓝),调整如下.注意看直方图的变化...看到了吧.呵呵,再调整绿色通道(操作如上)...再看看红色通道.亮度和颜色的直方图.注意看直方图的变化...像素和颜色分布均匀协调多了吧.:通过上面的红,亮度和颜色的直方图知道.图像还是偏暗,而且红色分布不协调,主要要是集中在低于80的暗部区(红色直方图).所以我在图层--调整--色彩平衡(暗部)调整红色...调整好了,我再看看亮度和颜色的直方图.(像素和颜色分布更均匀协调了吧.)但我们通过直方图观察,还是可以看到照片还是偏暗了...(象素点和颜色大部分集中于128以下)所以我调整一下亮度,我这里用曲线(其他组件也可以)最后再来观察RGB和颜色的直方图...像素和颜色分布基本均匀,协调.因为是室内照片,平均值应该会稍低于128(亮度).这里强调一下,我这是原理和基础知识,但并不代表我精通调色.不会调请见谅...在这里我必须感谢村长同志之前对我的指点和启发.希望各位前辈能作补充和指正.让我们优秀起来...[本帖最后由胡昆于 2007-4-13 12:14 编辑]。
数字图像处理入门—直方图修正和彩色变换
数字图像处理入门—直方图修正和彩色变换这次,我们主要和调色板打交道。
先从最简单的反色讲起。
1. 反色(invert)反色就是形成底片效果。
如下图所示,图2为图1反色后的结果图1. 原图图2. 图1反色后的结果反色有时是很有用的,比如说,图1中黑色区域占绝大多数,这样打印起来很费墨,我们可以先进行反色处理再打印。
反色的实际含义是将R,G,B值反转。
若颜色的量化级别是256,则新图的R,G,B值为255减去原图的R,G,B值。
这里针对的是所有图,包括真彩图,带调色板的彩色图(又称为伪彩色图),和灰度图。
针对不同种类有不同的处理。
先看看真彩图。
我们知道真彩图不带调色板,每个像素用3个字节,表示R,G,B三个分量。
所以处理很简单,把反转后的R,G,B值写入新图即可。
再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。
灰度图是一种特殊的伪彩色图,只不过调色板中的R,G,B值都是一样的而已。
所以反转的处理和上面讲的一样。
这里,我想澄清一个概念。
过去我们讲二值图时,一直都说成黑白图。
二值位图一定是黑白的吗?答案是不一定。
我们安装Windows95时看到的那幅setup.bmp是由蓝色和黑色组成的,但它实际上是二值图。
原来,它的调色板中的两种颜色是黑与蓝,而不是黑与白。
所以说二值图也可以是彩色的,只不过一般情况下是黑白图而已。
实现反色的源程序2. 彩色图转灰度图(color to grayscale)我们在第二讲时提到了YUV的颜色表示方法,知道在这种表示方法中,Y分量的物理含义就是亮度,它含了灰度图的所有信息,只用Y分量就完全能够表示出一幅灰度图来。
YUV和RGB之间有着如下的对应关系。
我们利用上式,根据R,G,B的值求出Y值后,将R,G,B值都赋值成Y,就能表示出灰度图来,这就是彩色图转灰度图的原理。
先看看真彩图。
ps直方图与HSI色彩模型心得
ps直方图与HSI色彩模型心得色阶是Photoshop中最为重要调整工具之一,懂得用好色阶面板,对调节图片明暗程度、校正色调范围、色彩平衡是非常有帮助的,本文详细介绍色阶面板和教你如何使用色阶面板和教你看懂色阶直方图。
色阶意思其实就是合并颜色的发光级别,调整色阶就是调整色光的强度级别。
色阶的主要作用分别如下:(1)它可以调整图像的阴影,图像的中间调。
(2)它可以校正色调范围和色彩平衡。
(3)总之,它不但可以调整色调,还可以调整色彩,所以色阶运用范围非常广泛。
在直方图中水平方向从左到右分别代表为:黑场,灰场,白场。
垂直方向上的高度是代表着像素的数量。
学习ps实例很重要,在能够激起学习兴趣的同时,还能够掌握一些基本的操作技巧,遇到不明白的再去看书,这样印象就比先看书深刻得多。
在ps中,所有的快捷键的功能在菜单中都能找到,无须死记硬背。
以后你接触得多了,自然就能熟练掌握。
想要学好ps就要细心去观察别人是怎么用的,这样你就可以少走很多的弯路。
还有不要急于求成,尤其象通道和色彩调整比较深的内容,可以放在后一步。
刚开始学习一下抠图以及画一下日用品,并把它放在桌面上,使自己有成就感,以提起对photoshop的学习兴趣。
学习ps这门课程要有耐心,要肯下苦工夫有的图形一次做不好,两次三次... 直到做好为止。
.上课就要留意简单的处理图片。
PS只是一个工具而已,它也要人的操作,不要把它看的太神秘,不敢去尝试,认真地做。
不要死看书那是不全面的看十本书,还不如亲手做一做,做不好也不要气馁。
因为你从失败中得到了经验。
试图掌握PS的每一个功能,熟悉每一个工具的运用。
拿到一个例子的时候要分析图形中的每个元素不要看不起每个图形的元素每个复杂的图形都是由简单的元素构成的,需要用到什么工具。
大概在脑子里有个印象做起来就会比较顺心,但是”认真和”耐心"还是少不了的。
还要学会请教老师和同学问题,不懂、不会的问题就要问。
要时常总结、吸收自己和其它人的小窍门、技巧记下来。
利用直方图和波形监视器提升调色技巧
利用直方图和波形监视器提升调色技巧调色是视频制作过程中至关重要的一步,它可以改善画面的色彩、对比度和明暗度,使其更加生动和吸引人。
Adobe Premiere Pro软件内置了直方图和波形监视器这两个实用工具,使得我们能够更准确地调整图像的色彩和曝光度。
在本文中,我们将重点介绍如何利用这两个工具来提升调色技巧。
首先,我们来了解一下直方图。
直方图是显示图像中各个亮度级别所包含像素数量的图表。
在Adobe Premiere Pro中,我们可以通过在监视窗口中选择“直方图”面板来打开直方图工具。
直方图由从0到255的亮度级别组成,其中0代表黑色,255代表白色。
直方图的横轴表示亮度级别,纵轴表示每个亮度级别所包含的像素数量。
直方图可以帮助我们判断图像的曝光情况和对比度。
如果直方图的峰值偏向左侧,表示图像有过多的暗部细节,而亮部细节较少。
相反,如果直方图的峰值偏向右侧,表示图像有过多的亮部细节,而暗部细节较少。
我们可以根据直方图的形状来判断是否需要调整图像的亮度和对比度。
接下来,我们来了解一下波形监视器。
波形监视器可以显示图像中亮度和色彩的变化。
在Adobe Premiere Pro中,我们可以通过在监视窗口中选择“波形监视器”面板来打开波形监视器工具。
波形监视器由从0到100的亮度级别组成,其中0代表黑色,100代表白色。
波形监视器可以帮助我们调整图像的亮度和对比度。
在波形监视器中,我们可以观察到图像的曲线是否超出了0到100的范围。
如果曲线超出了范围,表示图像中的细节可能被过度曝光或者过度剪裁。
我们可以通过调整图像的亮度和对比度来使曲线保持在0到100的范围内,以获得更好的图像质量。
当我们使用直方图和波形监视器进行调色时,可以使用以下步骤:1. 打开直方图和波形监视器工具:在Adobe Premiere Pro的监视窗口中选择“直方图”和“波形监视器”面板。
2. 观察直方图:通过观察直方图的形状和峰值位置,判断图像是否需要调整亮度和对比度。
直方图修正和彩色变换
第5章直方图修正和彩色变换这一章,我们主要和调色板打交道。
先从最简单的反色讲起。
5.1 反色反色(invert)就是形成底片效果。
例如,图5.2为图5.1反色后的结果。
图5.1 原图图5.2 图5.1反色后的结果反色有时是很有用的,比如,图5.1中黑色区域占绝大多数,这样打印起来很费墨,我们可以先进行反色处理后再打印。
反色的实际含义是将R、G、B值反转。
若颜色的量化级别是256,则新图的R、G、B值为255减去原图的R、G、B值。
这里针对的是所有图,包括真彩图、带调色板的彩色图(又称为伪彩色图)、和灰度图。
针对不同种类有不同的处理。
先看看真彩图。
我们知道真彩图不带调色板,每个象素用3个字节,表示R、G、B三个分量。
所以处理很简单,把反转后的R、G、B值写入新图即可。
再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。
灰度图是一种特殊的伪彩色图,只不过调色板中的R、G、B值都是一样的而已。
所以反转的处理和上面讲的一样。
这里,我想澄清一个概念。
过去我们讲二值图时,一直都说成黑白图。
二值位图一定是黑白的吗?答案是不一定。
我们安装Windows95时看到的那幅setup.bmp是由蓝色和黑色组成的,但它实际上是二值图。
原来,它的调色板中的两种颜色是黑与蓝,而不是黑与白。
所以说二值图也可以是彩色的,只不过一般情况下是黑白图而已。
下面的程序实现了反色,注意其中真彩图和调色板位图处理时的差别。
BOOL Invert(HWND hWnd){DWORD OffBits,BufSize;LPBITMAPINFOHEADER lpImgData;LPSTR lpPtr;HLOCAL hTempImgData;LPBITMAPINFOHEADER lpTempImgData;LPSTR lpTempPtr;HDC hDc;HFILE hf;LONG x,y;LOGPALETTE *pPal;HPALETTE hPrevPalette=NULL;HLOCAL hPal;DWORD i;unsigned char Red,Green,Blue;OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);BufSize=OffBits+bi.biHeight*LineBytes; //新开缓冲区的大小if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL){MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);return FALSE;}lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);//拷贝头信息memcpy(lpTempImgData,lpImgData,BufSize);hDc=GetDC(hWnd);if(NumColors!=0){ //NumColors不为0说明是带调色板的lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);//指向原图数据lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);//指向新图数据//为新调色板分配内存hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors*sizeof(PALETTEENTRY));pPal =(LOGPALETTE *)LocalLock(hPal);pPal->palNumEntries =(WORD) NumColors;pPal->palVersion = 0x300;for (i = 0; i < NumColors; i++) {Blue=(unsigned char )(*lpPtr++);Green=(unsigned char )(*lpPtr++);Red=(unsigned char )(*lpPtr++);lpPtr++;//反转调色板中的颜色,存入新的调色板pPal->palPalEntry[i].peRed=(BYTE)(255-Red);pPal->palPalEntry[i].peGreen=(BYTE)(255-Green);pPal->palPalEntry[i].peBlue=(BYTE)(255-Blue);pPal->palPalEntry[i].peFlags=0;*(lpTempPtr++)=(unsigned char)(255-Blue);*(lpTempPtr++)=(unsigned char)(255-Green);*(lpTempPtr++)=(unsigned char)(255-Red);*(lpTempPtr++)=0;}if(hPalette!=NULL)DeleteObject(hPalette);hPalette=CreatePalette(pPal); //产生新的调色板LocalUnlock(hPal);LocalFree(hPal);if(hPalette){hPrevPalette=SelectPalette(hDc,hPalette,FALSE);RealizePalette(hDc);}}else{ //不带调色板,说明是真彩色图for(y=0;y<bi.biHeight;y++){lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);for(x=0;x<bi.biWidth;x++){Blue=(unsigned char )(*lpPtr++);Green=(unsigned char )(*lpPtr++);Red=(unsigned char )(*lpPtr++);//反转位图数据中的颜色,存入新的位图数据中*(lpTempPtr++)=(unsigned char)(255-Blue);*(lpTempPtr++)=(unsigned char)(255-Green);*(lpTempPtr++)=(unsigned char)(255-Red);}}}if(hBitmap!=NULL)DeleteObject(hBitmap);hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,(LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpTempImgData,DIB_RGB_COLORS);if(hPalette && hPrevPalette){SelectPalette(hDc,hPrevPalette,FALSE);RealizePalette(hDc);}hf=_lcreat("c:\\invert.bmp",0);_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));_lwrite(hf,(LPSTR)lpTempImgData,BufSize);_lclose(hf);//释放内存和资源ReleaseDC(hWnd,hDc);LocalUnlock(hTempImgData);LocalFree(hTempImgData);GlobalUnlock(hImgData);return TRUE;}5.2 彩色图转灰度图第2章中提到了YUV的颜色表示方法,在这种表示方法中,Y分量的物理含义就是亮度,它含了灰度图(grayscale)的所有信息,只用Y分量就完全能够表示出一幅灰度图来。
直方图修正法
直方图修正法分为直方图均衡化和直方图规定化目的:采用直方图修整后可使图像的灰度间距拉开或使灰度分布均匀,从而增大反差,使图像细节清晰,从而增强图像。
1.直方图均衡化通过对原图像进行某种变换使原图像的灰度直方图修正为均匀的直方图的一种方法以r 和s 分别表示归一化了的原图像灰度和经直方图修正后的图像灰度。
即 1,0≤≤s r 在[]1,0区间内的任一个r ,经变换T (r )都可产生一个S ,且 S=T(r)T(r)为变换函数,应满足下列条件:(1)在10≤≤r 内为单调递增函数(保证灰度级从黑到白的次序不变);(2)在10≤≤r 内,有1)(0≤≤r T 。
(确保映射后的像素灰度在允许的范围内) 由概率论理论可知,如果已知随机变量r 的概率密度为)(r p r ,而随机变量s 是r 的函数,则s 的概率密度)(s p s 可以由)(r p r 求出。
假定随机变量s 的分布函数用)(s F s 表示,根据分布函数定义,则有⎰⎰∞-∞-==s r r s s dr r ds s s p p F )()()([])()(1s dsd s T p p r s -=⇒ (1) 因为归一化假定 1)(=s p s由(1)得dr r ds p r )(= 两边积分得 ⎰==rrdr r r T s p 0)()( (变换函数) 上式表明当变换函数T (r )是原图像直方图累积分布函数时,能达到直方图均衡化的目的。
对于灰度级为离散的数字图像,用频率来代替概率。
∑∑=====k j k j j j r k k n r T n r p s 00)()(1,,2,1,0,10-=≤≤L k r k2.直方图规定化(直方图匹配)使原图像灰度直方图变成规定形状的直方图而对图像作修正的增强方法。
假设)(r p r 和)(z p z分别表示已归一化的原图像灰度概率密度函数和希望得到的图像概率密度函数。
首先对原图像进行直方图均衡化处理,即求变换函数:⎰==rrdr r r T s p 0)()( 假定已得到了所希望的图像,对它也进行均衡化处理,即⎰==zzdr r z G v p 0)()( (2) 它的逆变换是 )(1v z G -=即由均衡化后的灰度级得到希望图像的灰度级。
【精品】直方图修正
一、实验名称:直方图修正二、实验目的1.对影像进行直方图规定化和均衡化2.利用另外一幅影像进行直方图匹配3.利用直方图统计功能对结果进行分析三、实验内容1.对两幅卫星遥感影像进行规定化并统计分析2.对一幅卫星遥感影像进行均衡化并统计分析四、实验所用的仪器设备计算机和ENVI软件在不同时刻同地的卫星遥感影像2幅五、实验原理1.直方图规定化:是使原图像灰度直方图变成规定形状的直方图而对原始图像作修正的增强方法。
作用:对于在不同时间获取的同一地区或者邻接地区的图像,或者是由于太阳高度角或大气的影响引起差异的图像很有用,特别是对图像镶嵌和变化检测。
2.直方图均衡化:又称直方图平坦化,是将一已知灰度概率密度分布的影响,经过某种变换变成一幅具有均匀灰度概率密度分布的新影像,其结果是是扩大了像元取值得动态范围。
效果:(1)均衡后每个灰度级的像元频率近似相等。
(2)频率少的灰度级被合并,频率数高的灰度级被保留,可以增强影像上大面积地物与周围地物的反差。
六、实验步骤1.直方图规定化与统计:同时打开两幅遥感影像,影像显示号分别为Display#1,Display#2.规划化前影像——Display#2规划化前影像——Display#11)在Display#2的主影像窗口选择Enhance/HistogramMatching,出现HistogramMatchingInputparameter对化框。
2)在“MatchTo”列表中,选择匹配的直方图的影像显示号Display#1。
3)在InputHistogram/Image/OK得到直方图匹配后的结果。
4)在“Flie/SaveImageAs/Imagefile”中得到对话框“OutputDisplaytoimageFile”选择保存所在文件下,保存为”guihua”。
在“BasicTools/statistics/ComputerStatistics/ComputerStatisticsInputFile”,选择所要分析统计的图像文件.例如guihua/OK/BasicStats/Histograms/OK按Display#1的影像进行匹配后的Display#2即guihua规划化前影像——Display#1 在StatisticsResults:guihua/SelectPlot/Histogram:AllBands并对三幅图进行分析Guihua直方统计图Display#2直方统计图Display#1直方统计图结果分析:[1].由上显示图—1为规划化后的图,图—2,3为规划化前的图,三幅图每个都有3个波段,图—2,3在灰度值0—255之间变化,图—1在0-210之间变化,图—1,2在灰度值80—170变化较集中。
基于直方图均衡化的灰度图像和彩色图像变化原理-数字图像处理论文-计算机论文
基于直方图均衡化的灰度图像和彩色图像变化原理-数字图像处理论文-计算机论文——文章均为WORD文档,下载后可直接编辑使用亦可打印——1 概述图像增强是数字图像处理中非常重要的一个组成部分。
由于受到拍摄感光设备、拍摄时的环境、传输过程等客观存在且无法完全消除的因素的影响,图像中会形成噪声或者模糊效应。
为了提高成像质量,消除噪声或者模糊等不需要的冗余信息,人们需要使用图像增强技术来突出图像中感兴趣的区域或者物体。
图像增强方法有两类:一类为频域处理法,另一类为空间域处理法。
频域处理法主要是指以二维离散傅里叶变换为基础的各种滤波方法,通常可以设计不同的滤波器来对二维信号(图像)中不同的频率分量进行筛选;空间域处理法是直接对图像的像素进行处理,通过对灰度值的变换来增强构成图像的像素。
主要介绍基于直方图均衡化的数字图像增强技术,属于空间域处理法的一种。
2 灰度图像增强2.1 常用方法常用的图像一般都为灰度图像,若图像所对应的灰度函数为F (X,Y),则F 表示灰度值,也就是图像上对应点的亮度。
亮度是观察者衡量所看到物体表面所反射的光强度的量度。
作为一种空间域的图像处理方法,灰度变换是一种点变换操作,即按照预先设定好的函数或者规则逐个修改图像中的像素值,目的是改变图像灰度的分布范围,改善图像的显示质量。
常见的灰度变换算法有基于线性函数的灰度变换和基于非线性函数的灰度变换.使用基于线性函数的灰度变换时,通常先统计处图像中灰度的分布范围,然后选取合适的线性函数将整幅图像的灰度扩展至事先选取好的范围内,或者整个动态范围(通常0-255),这样可以将感兴趣的区域和不感兴趣的区域对比度增强。
另外也可以针对不同的灰度区间,采用不同的线性函数进行扩展拉伸。
基于非线性函数的灰度变换与之类似,不过选取的是非线性函数进行扩展,而且非线性函数在不同灰度区间内的扩展效果是不同的。
下面对线性灰度变换的过程进行介绍和仿真实验。
2.2 直方图均衡化直方图均衡化是应用最为广泛的线性灰度变换方法。
遥感影像直方图修正及彩色变换
遥感影像直方图修正及彩色变换
韩玲;吴云海
【期刊名称】《地球科学与环境学报》
【年(卷),期】2002(024)001
【摘要】遥感技术是当前人类研究地球资源环境的一种主要技术手段.针对遥感影像的特点,对其进行直方图修正及彩色变换的数字图像处理,用VC++6.0程序设计语言,实现几种变换.
【总页数】4页(P59-62)
【作者】韩玲;吴云海
【作者单位】长安大学,地质工程与测绘工程学院,陕西,西安,710054;长安大学,地质工程与测绘工程学院,陕西,西安,710054
【正文语种】中文
【中图分类】P238.8;TP391.41
【相关文献】
1.基于I HS变换和小波变换的遥感影像融合 [J], 戴洪宝;许继影;夏青森;陈力
2.基于彩色空间变换的迭代反射投影遥感影像的超分辨率重建 [J], 郭桐宇
3.选择最佳彩色变换用于遥感影像复合的定量评价方法 [J], 贾永红;李德仁
4.彩色空间变换在DEM与遥感影像复合中的应用研究 [J], 梁伟;杨勤科
5.全彩色遥感影像彩色合成效应的研究 [J], 万晓霞;易尧华
因版权原因,仅展示原文概要,查看原文内容请购买。
彩色图像增强方案
彩色图像增强方案引言随着数码相机的普及和移动设备的快速发展,人们越来越依赖于数字图像的拍摄和处理。
然而,由于各种原因,例如光线条件不佳或摄影技术不足,拍摄得到的彩色图像可能会失真、模糊或暗淡。
因此,彩色图像增强成为了一个重要的研究领域。
在本文中,我们将介绍几种常见的彩色图像增强方案,讨论它们的原理和效果。
直方图均衡化直方图均衡化是一种常见的彩色图像增强方法,它通过将图像的像素值映射到一个更广的范围内,来增加图像的对比度。
直方图均衡化的基本原理是将输入图像的像素值分布调整到一个更均匀的分布。
具体步骤如下:1.将彩色图像转换为灰度图像。
2.计算灰度图像的直方图。
3.对直方图进行归一化,使每个像素值的概率分布相等。
4.计算累积概率分布函数(CDF)。
5.将原始图像的每个像素值替换为CDF的值。
直方图均衡化可以显著提高图像的对比度和细节。
然而,它可能会导致一些问题,例如过度增强细节和噪声。
因此,在实际应用中,人们通常采用一些改进的直方图均衡化方法,如自适应直方图均衡化和双线性插值。
自适应直方图均衡化自适应直方图均衡化是对传统直方图均衡化的改进。
传统直方图均衡化将整张图像的像素值映射到一个相同的范围内,但在真实场景下,图像的亮度分布可能是不均匀的。
自适应直方图均衡化可以根据局部亮度分布来调整像素值的映射。
具体步骤如下:1.将彩色图像转换为灰度图像。
2.将图像分割成多个块。
3.对每个块进行直方图均衡化。
4.将均衡化后的块重新组合成一张图像。
通过自适应直方图均衡化,我们可以更好地保留图像的局部细节,并减少增强后的图像的噪声。
双线性插值双线性插值是一种常用的图像增强方法,它可以在不改变图像尺寸的情况下增强图像的细节。
双线性插值的基本原理是根据周围像素的值来估计每个像素的值。
具体步骤如下:1.将彩色图像转换为灰度图像。
2.将图像分割成多个块。
3.对每个块中的像素进行双线性插值。
4.将插值后的像素重新组合成一张图像。
图像色彩、色调的调整
图像色彩、色调的调整【考点要求】1、了解查看图像色阶分布的方法2、了解图像色阶控制作用3、掌握图像色阶控制的各种方法4、了解图像色彩控制的方法及效果5、掌握图像色彩控制的操作方法6、掌握特殊色调控制的操作【易错点】一、图像色阶调整色阶是表示图像亮度强弱的指数指标,图像的色彩丰满度和精细度是由色阶决定的。
1、“直方图”面板在PS中打开一副图像,选择“窗口—直方图”命令,打开“直方图”调板,将显示整个图像的色阶分布状态,如果图像上建立了选区,则“直方图”调板只显示选区内图像的色阶分布状况图。
注意“色阶”是指图像中最暗和最两处差值的大小、图像中高光、中间调和暗调像素所占的比例多少等使用与视觉器官的各种附加效果。
在“直方图”调板扩展图的“通道”列表中可以选择图像的某个通道,查看单个通道的色调范围。
直方图的纵轴表示条像素的数量,横轴表示亮度色阶没有左支至右的数值为0到255,图像由暗到亮。
“直方图”扩展视图2、色阶(1)“色阶”命令调整对象:整幅图像、选区、某一图层、某一颜色通道;(2)具体操作步骤:1)打开需要调整色调分布的图像,并根据需要选择图层或建立选区;2)选择“图像—调整—色阶”命令,或按CTRL+L快捷键,打开“色阶”对话框;3)在通道列表中炫耀进行色阶调整的通道;4)在色阶对话框中调“输入色阶”中的暗调值、中间值和高光值,调整输出色阶的暗调值和高光值等参数,单击“确定”按钮。
(3)“色阶”对话框参数输入色阶:左侧框表暗调值(暗部色调),取值范围:0—253;中间框表示中间值(中间色调),取值范围0.1—9.99,;右侧框表示高光值(亮部色调)取值范围:2-255。
输出色阶:左侧框代表暗调值(暗部色调),右侧框表示高光值(亮部色调)。
吸管工具:使用黑色吸管是将图像中所有像素的亮度减去吸光单击处的像素亮度值。
使用灰色吸管是将图像中所有像素的亮度值加上吸管单击处的像素亮度值。
使用白色吸管是用该吸管所在的点钟像素灰点调整图像的色彩分布。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第5章 直方图修正和彩色变换 这一章,我们主要和调色板打交道。
先从最简单的反色讲起。
5.1 反色反色(invert)就是形成底片效果。
例如,图5.2为图5.1反色后的结果。
图5.1 原图图5.2 图5.1反色后的结果 反色有时是很有用的,比如,图5.1中黑色区域占绝大多数,这样打印起来很费墨,我们可以先进行反色处理后再打印。
反色的实际含义是将R 、G 、B 值反转。
若颜色的量化级别是256,则新图的R 、G 、B 值为255减去原图的R 、G 、B 值。
这里针对的是所有图,包括真彩图、带调色板的彩色图(又称为伪彩色图)、和灰度图。
针对不同种类有不同的处理。
先看看真彩图。
我们知道真彩图不带调色板,每个象素用3个字节,表示R 、G 、B 三个分量。
所以处理很简单,把反转后的R 、G 、B 值写入新图即可。
再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。
灰度图是一种特殊的伪彩色图,只不过调色板中的R 、G 、B 值 都是一样的而已。
所以反转的处理和上面讲的一样。
这里,我想澄清一个概念。
过去我们讲二值图时,一直都说成黑白图。
二值位图一定是黑白的吗?答案是不一定。
我们安装Windows95时看到的那幅setup.bmp 是由蓝色和黑色组成的,但它实际上是二值图。
原来,它的调色板中的两种颜色是黑与蓝,而不是黑与白。
所以说二值图也可以是彩色的,只不过一般情况下是黑白图而已。
下面的程序实现了反色,注意其中真彩图和调色板位图处理时的差别。
BOOL Invert(HWND hWnd){DWORD OffBits,BufSize;LPBITMAPINFOHEADER lpImgData;LPSTR lpPtr;HLOCAL hTempImgData;LPBITMAPINFOHEADER lpTempImgData;LPSTR lpTempPtr;HDC hDc;HFILE hf;LONG x,y;LOGPALETTE *pPal;HPALETTE hPrevPalette=NULL;HLOCAL hPal;DWORD i;unsigned char Red,Green,Blue;OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);BufSize=OffBits+bi.biHeight*LineBytes; //新开缓冲区的大小if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL){MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);return FALSE;}lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);//拷贝头信息memcpy(lpTempImgData,lpImgData,BufSize);hDc=GetDC(hWnd);if(NumColors!=0){ //NumColors不为0说明是带调色板的lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);//指向原图数据lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);//指向新图数据//为新调色板分配内存hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors*sizeof(PALETTEENTRY));pPal =(LOGPALETTE *)LocalLock(hPal);pPal->palNumEntries =(WORD) NumColors;pPal->palVersion = 0x300;for (i = 0; i < NumColors; i++) {Blue=(unsigned char )(*lpPtr++);Green=(unsigned char )(*lpPtr++);Red=(unsigned char )(*lpPtr++);lpPtr++;//反转调色板中的颜色,存入新的调色板pPal->palPalEntry[i].peRed=(BYTE)(255-Red);pPal->palPalEntry[i].peGreen=(BYTE)(255-Green);pPal->palPalEntry[i].peBlue=(BYTE)(255-Blue);pPal->palPalEntry[i].peFlags=0;*(lpTempPtr++)=(unsigned char)(255-Blue);*(lpTempPtr++)=(unsigned char)(255-Green);*(lpTempPtr++)=(unsigned char)(255-Red);*(lpTempPtr++)=0;}if(hPalette!=NULL)DeleteObject(hPalette);hPalette=CreatePalette(pPal); //产生新的调色板LocalUnlock(hPal);LocalFree(hPal);if(hPalette){hPrevPalette=SelectPalette(hDc,hPalette,FALSE);RealizePalette(hDc);}}else{ //不带调色板,说明是真彩色图for(y=0;y<bi.biHeight;y++){lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);for(x=0;x<bi.biWidth;x++){Blue=(unsigned char )(*lpPtr++);Green=(unsigned char )(*lpPtr++);Red=(unsigned char )(*lpPtr++);//反转位图数据中的颜色,存入新的位图数据中*(lpTempPtr++)=(unsigned char)(255-Blue);*(lpTempPtr++)=(unsigned char)(255-Green);*(lpTempPtr++)=(unsigned char)(255-Red);}}}if(hBitmap!=NULL)DeleteObject(hBitmap);hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,(LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpTempImgData,DIB_RGB_COLORS);if(hPalette && hPrevPalette){SelectPalette(hDc,hPrevPalette,FALSE);RealizePalette(hDc);}hf=_lcreat("c:\\invert.bmp",0);_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));_lwrite(hf,(LPSTR)lpTempImgData,BufSize);_lclose(hf);//释放内存和资源ReleaseDC(hWnd,hDc);LocalUnlock(hTempImgData);LocalFree(hTempImgData);GlobalUnlock(hImgData);return TRUE;}5.2 彩色图转灰度图第2章中提到了YUV的颜色表示方法,在这种表示方法中,Y分量的物理含义就是亮度,它含了灰度图(grayscale)的所有信息,只用Y分量就完全能够表示出一幅灰度图来。
YUV 和RGB之间有着如下的对应关系:我们利用上式,根据R、G、B的值求出Y值后,将R、G、B值都赋值成Y,就能表示出灰度图来,这就是彩色图转灰度图的原理。
先看看真彩图。
我们知道真彩图不带调色板,每个象素用3个字节,表示R、G、B三个分量。
所以处理很简单,根据R、G、B的值求出Y值后,将R、G、B值都赋值成Y,写入新图即可。
再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的彩色变成灰度,形成新调色板,而位图数据不用动,就可以了。
下面的程序实现了彩色图到灰度图的转换,注意其中真彩图和调色板位图处理时的差别。
BOOL ColortoGrayScale(HWND hWnd){DWORD SrcOffBits,SrcBufSize,DstBufSize,DstLineBytes; LPBITMAPINFOHEADER lpImgData;LPSTR lpPtr;HLOCAL hTempImgData;LPBITMAPINFOHEADER lpTempImgData;LPSTR lpTempPtr;HDC hDc;HFILE hf;LONG x,y;BITMAPFILEHEADER DstBf;BITMAPINFOHEADER DstBi;LOGPALETTE *pPal;HPALETTE hPrevPalette;HLOCAL hPal;DWORD NewNumColors;WORD NewBitCount;float Y;DWORD i;unsigned char Red,Green,Blue,Gray;NewNumColors=NumColors; //NewNumColors为新图的颜色数NewBitCount=bi.biBitCount; //NewBitCount为新图的颜色位数if(NumColors==0) //真彩图{NewNumColors=256;NewBitCount=8;}//由于颜色位数有可能发生了改变,所以要重新计算每行占用的字节数以及//新图的缓冲区大小DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*NewBitCount);DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NewNumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*bi.biHeight);//DstBf和DstBi为新的BITMAPFILEHEADER和BITMAPINFOHEADER //拷贝原来的头信息memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER));memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER));//做必要的改变DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);DstBf.bfOffBits=(DWORD)(NewNumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));DstBi.biClrUsed=0;DstBi.biBitCount=NewBitCount;//原图的缓冲区的大小SrcOffBits=bf.bfOffBits- sizeof(BITMAPFILEHEADER);SrcBufSize=SrcOffBits+bi.biHeight*LineBytes;if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL){MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);return FALSE;}lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); //拷贝头信息和位图数据memcpy(lpTempImgData,lpImgData,DstBufSize);//用新的BITMAPINFOHEADER替换原来的头信息memcpy(lpTempImgData,(char *)&DstBi,sizeof(BITMAPINFOHEADER));//lpPtr指向原图的数据lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);//lpTempPtr指向新图的数据lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);//为新的调色板分配内存hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NewNumColors* sizeof(PALETTEENTRY));pPal =(LOGPALETTE *)LocalLock(hPal);pPal->palNumEntries =(WORD) NewNumColors;pPal->palVersion = 0x300;if(NumColors==0) //真彩色for (i = 0; i < 256; i++) { //灰度从(0,0,0)到(255,255,255)pPal->palPalEntry[i].peRed=(BYTE)i;pPal->palPalEntry[i].peGreen=(BYTE)i;pPal->palPalEntry[i].peBlue=(BYTE)i;pPal->palPalEntry[i].peFlags=(BYTE)0;*(lpTempPtr++)=(unsigned char)i;*(lpTempPtr++)=(unsigned char)i;*(lpTempPtr++)=(unsigned char)i;*(lpTempPtr++)=0;}elsefor (i = 0; i < NewNumColors; i++) { //带调色板的彩色图Blue=(unsigned char )(*lpPtr++);Green=(unsigned char )(*lpPtr++);Red=(unsigned char )(*lpPtr++);Y=(float)(Red*0.299+Green*0.587+Blue*0.114);Gray=(BYTE)Y;lpPtr++;//从原来的调色板中的颜色计算得到Y值,写入新的调色板pPal->palPalEntry[i].peRed=Gray;pPal->palPalEntry[i].peGreen=Gray;pPal->palPalEntry[i].peBlue=Gray;pPal->palPalEntry[i].peFlags=0;*(lpTempPtr++)=(unsigned char)Gray;*(lpTempPtr++)=(unsigned char)Gray;*(lpTempPtr++)=(unsigned char)Gray;*(lpTempPtr++)=0;}if(hPalette!=NULL)DeleteObject(hPalette);//生成新的逻辑调色板hPalette=CreatePalette(pPal);LocalUnlock(hPal);LocalFree(hPal);hDc=GetDC(hWnd);if(hPalette){hPrevPalette=SelectPalette(hDc,hPalette,FALSE);RealizePalette(hDc);}if(NumColors==0) //真彩色图才需要处理位图数据for(y=0;y<bi.biHeight;y++){lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes);lpTempPtr=(char*)lpTempImgData+(DstBufSize-DstLineBytes-y*DstLineBytes);for(x=0;x<bi.biWidth;x++){Blue=(unsigned char )(*lpPtr++);Green=(unsigned char )(*lpPtr++);Red=(unsigned char )(*lpPtr++);Y=(float)(Red*0.299+Green*0.587+Blue*0.114);//从位图数据计算得到Y值,写入新图中Gray=(BYTE)Y;*(lpTempPtr++)=(unsigned char)Gray;}}if(hBitmap!=NULL)DeleteObject(hBitmap);//产生新的位图hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER)+NewNumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpTempImgData,DIB_RGB_COLORS);if(hPalette && hPrevPalette){SelectPalette(hDc,hPrevPalette,FALSE);RealizePalette(hDc);}hf=_lcreat("c:\\gray.bmp",0);_lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER));_lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);_lclose(hf);//释放内存和资源ReleaseDC(hWnd,hDc);LocalUnlock(hTempImgData);LocalFree(hTempImgData);GlobalUnlock(hImgData);return TRUE;}5.3 真彩图转256色图我们知道,真彩图中包含最多达224种颜色,怎样从中选出256种颜色,又要使颜色的失真比较小,这是一个比较复杂的问题。