图像由彩色转化为灰度的过程叫灰度化,也叫去色。
彩色图像灰度化的原理很简单,就是按某种计算方法将图像各像素的R、G、B分量取成同样的值即可。计算方法有几种:
1、每个像素R、G、B各分量的值为该象素R、G、B的平均值;
2、每个像素R、G、B各分量的值为该象素R、G、B中最大值;
3、按YUV颜色空间原理,每个像素R、G、B各分量的值为:Y = 0.3R + 0.59G + 0.11B。
在Delphi程序的具体应用中,一般是对图像各像素点逐点取值、计算和修改等过程实现的,很繁琐,而且效率不高。
使用GDI+,通过对ColorMatrix矩阵数组进行适当设置,可以很很轻松的搞定。下面是个按YUV颜色空间原理对彩色图像灰度化的Delphi过程:
implementation
usesGdiplus,GdipTypes;
//彩色图像灰度化
procedureGrayImage(Image:TGpImage);
const
ColorMatrix:TColorMatrix=
((0.3,0.3,0.3,0.0,0.0),//Red
(0.59,0.59,0.59,0.0,0.0),//Green
(0.11,0.11,0.11,0.0,0.0),//Blue
(0.0,0.0,0.0,1.0,0.0),//Alpha
(0.0,0.0,0.0,0.0,1.0));
var
Tmp:TGpImage;
attr:TGpImageAttributes;
g:TGpGraphics;
begin
Tmp:=Image.Clone;
g:=TGpGraphics.Create(Image);
attr:=TGpImageAttributes.Create;
try
attr.SetColorMatrix(ColorMatrix);
g.DrawImage(Tmp,GpRect(0,0,Image.Width,Image.Height),
0,0,Tmp.Width,Tmp.Height,utPixel,attr);
finally
g.Free;
attr.Free;
Tmp.Free;
end;
end;
//测试
procedureTForm1.Button1Click(Sender:TObject);
var
Image:TGpImage;
g:TGpGraphics;
begin
Image:=TGpImage.Create('..media41001.jpg');
GrayImage(Image);
g:=TGpGraphics.Create(Handle,False);
g.DrawImage(Image,10,10);
g.Free;
image.Free;
end;
可以看出,过程中的实现代码相当简单,主要是try ... finally之间2句的代码,而起关键作用的就是这个ColorMatrix。
对于ColorMatrix,有关资料是这样的介绍的:
GDI+ 提供用于存储和操作图像的 Image 和 Bitmap 类。Image 和 Bitmap 对象将每个像素的颜色都存储为 32 位的数:红色、绿色、蓝色和 alpha 各占 8 位。这四个分量的值都是 0 到 255,其中 0 表示没有亮度,255 表示最大亮度。alpha 分量指定颜色的透明度:0 表示完全透明,255 表示完全不透明。
颜色矢量采用 4 元组形式(红色、绿色、蓝色、alpha)。例如,颜色矢量 (0, 255, 0, 255) 表示一种没有红色和蓝色但绿色达到最大亮度的不透明颜色。
表示颜色的另一种惯例是用数字 1 表示亮度达到最大。使用这种惯例,上一段中描述的颜色将用 (0, 1, 0, 1) 表示。GDI+ 在进行颜色变换时使用以 1 表示最大亮度的惯例。
可通过用 4×4 矩阵乘以这些颜色矢量将线性变换(旋转和缩放等)应用到颜色矢量中。但是,您不能使用 4×4 矩阵进行平移(非线性)。如果在每个颜色矢量中再添加一个虚拟的第 5 坐标(例如,数字 1),则可使用 5×5 矩阵应用任何组合形式的线性变换和平移。由线性变换组成的后跟平移的变换称为仿射变换。
从原理上说,ColorMatrix并不难理解,主要通过矩阵运算对颜色矢量进行线性或非线性的转换,以达到对图像的各种数字处理的目的。我在网上看到有很多人对于矩阵中的虚拟位不理解,而解答的的人可能心里明白,却也总是说的不彻不透,有时还把人越说越糊涂,似乎这个概念只可意会,不可言传。其实上面的解答已经很明确的,4*4矩阵只能进行颜色的线性变换,而不能进行非线性变换和平移,这就相当4把椅子坐了4个人,无法相互移位,如果加一把空椅,就可方便的实现移位了,这把空椅就是虚拟位!如果还不明白,可以看一下《大唐双龙传》,估计很多人都看过,这个虚拟位就是小说中所谓的“遁去的一”!^_^
从实际应用看,要真正熟练运用ColorMatrix却也并非那么简单,必须同时具备较好的数学和计算机图形学知识以及较高水平的编程能力,才能做到随心所欲的运用。本人由于各方面都很差,所以至今也没有完全搞明白它的一些具体运用(比如昨天发的文章《GDI+ 在Delphi程序的应用 -- 调整图像亮度》,对于图像亮度调整,我知道可以用ColorMatrix来实现,而不必逐点计算,但试验了几次,确实能够调整,但总是不很理想)。
分享到:
相关推荐
ColorMatrix结构体,图像的透明度的设置,将图像转换为灰度图,其中图像灰度化提供了三种方法,分别是平均值法,最大值法,加权平均值法。提供了一些关键C代码
第1章 Visual C++与数字图像处理 1 1.1 数字图像处理概述 2 1.1.1 图像与数字图像 2 1.1.2 数字图像处理研究的内容 4 1.1.3 数字图像处理的应用 6 1.2 Visual C++概述 8 1.2.1 C++语言简介 8 1.2.2 Visual C++简介 ...
图像颜色处理(ColorMatrix)源码
JavaScript应用实例-ColorMatrix颜色矩阵的用法.js
在Delphi中进行 YCrCb RGB 颜色值转换,载入一张测试图片,右侧显示的转换后的颜色图像,文本框中显示的是各个转换过的颜色值。希望通过这个Delphi例子,帮你了解一下YCrCb向RGB颜色值的转换过程,转换方法和思路,...
这样,当您在照片或图像编辑工具中使用该颜色矩阵时,您可以分析一个颜色矩阵的结果,该颜色矩阵与对图像进行的其他调整(正式或“幕后”)隔离开来。 编辑 2015 年 3 月 11 日:有一个名为新版 ImageJ,还有一个名...
AutoJs源码-ColorMatrix颜色矩阵的用法。本资源购买前提醒:本源码都是实际autojs项目模板,安装好autojs直接运行即可打开。1、支持低版本autojs。2、资源仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由...
android ColorMatrix的例子,也可以通过这个小工具获取自己想要的效果的过滤器设置数值
1.2 //用GDI+画图 18 1.3 C# 使用Bitmap类进行图片裁剪 19 1.1.8 方法一:拷贝像素。 20 1.1.9 方法二:运用Clone函数局部复制。 22 1.1.10 一、底片效果原理: 23 1.1.11 //以底片效果显示图像 23 1.1.12 二. 浮雕...
颜色矩阵 具有附加功能的 ColorMatrix 类,可用于代替 .NET 框架 System.Drawing.Imaging.ColorMatrix 类。 可用于轻松过滤图像的 RGB 颜色分量和色调、饱和度、亮度值。 基于和 。
使用eclipse编写,实现的图片的颜色三度的改变,有兴趣的可以下载查看
一个综合演示Matrix和ColorMatrix的例子(https://blog.csdn.net/tanmx219/article/details/81298671)
在 GDI+ 中应用的矩阵运算是 "相乘". 矩阵相乘有个前提: 就是第一个矩阵的 "列数" 要和第二个矩阵的 "行数" 一致. 譬如: 矩阵 A*B 要乘以 矩阵 M*N, 要求 B = M. GDI+ 中用到的 GP矩阵 是 3*3 的, 颜色矩阵...
输入图像的帧,计算出来ccm和awb的增益 % CORS = [CCM, WB_gain] = CalCCM(FRAME,FrameGR,width,height,bayer_order) % from frmae of photo, get the ccm data ,and AWBdata % Inputs: % FRAME, the image need...
一、 工具篇 Microsoft .NET Frame work 2.0(或2.0以上版本)、--NetFx20SP2_x86.exe (XP及之前的操作系统需...ColorMatrix.dll-- ColorMatrix.rar (MeGUI插件) BT709ToBT601.dll-- BT709ToBT601.rar (MeGUI插件)
主要介绍了Android 矩阵ColorMatrix的相关资料,需要的朋友可以参考下
源码通过调用CometGDIPlus.ec模块,实现了通过调整颜色矩阵绘图。
// 如果继续翻页,会出现BUG故在此限制 if (mBezierStart1.x || mBezierStart1.x > 480) { if (mBezierStart1.x ) mBezierStart1.x = mWidth - mBezierStart1.x; float f1 = Math.abs(mCornerX - ...
主要介绍了C#实现图像反色的方法,涉及C#操作图像颜色转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
对Bitmap进行颜色方面的处理