从RGB色转为灰度色算法=

合集下载

图像RGB值、灰度值、像素值的关系

图像RGB值、灰度值、像素值的关系

图像RGB值、灰度值、像素值的关系图像灰度值的概念是什么?灰度也可以认为是亮度,简单说就是色彩的深浅程度。

实际上在我们的日常生活中,通过三原色色彩深浅的组合,可以组成各种不同的颜色。

产品能够展现的灰度数量越多,也就意味着这款产品的色彩表现力更加丰富,能够实现更强的色彩层次。

例如三原色16级灰度,能显示的颜色就是16×16×16=4096色。

不过目前的产品256级灰度已经非常地普遍了。

所谓颜色或灰度级指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级越多,图像层次越清楚逼真。

灰度级取决于每个像素对应的刷新存储单元的位数和显示器本身的性能。

如每个象素的颜色用16位二进制数表示,我们就叫它16位图,它可以表达2的16次方即65536种颜色。

如每一个象素采用24位二进制数表示,我们就叫它24位图,它可以表达2的24次方即16777216种颜色。

灰度就是没有色彩,RGB色彩分量全部相等。

如果是一个二值灰度图象,它的象素值只能为0或1,我们说它的灰度级为2。

用个例子来说明吧:一个256级灰度的图象,RGB(100,100,100)就代表灰度为100,RGB(50,50,50)代表灰度为50。

灰度是指黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0,故黑白图片也称灰度图像,在医学、图像识别领域有很广泛的用途彩色图象的灰度其实在转化为黑白图像后的像素值(是一种广义的提法),转化的方法看应用的领域而定,一般按加权的方法转换,R , G ,B 的比一般为3:6:1。

任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:1.浮点算法:Gray=R*0.3+G*0.59+B*0.112.整数方法:Gray=(R*30+G*59+B*11)/1003.移位方法:Gray =(R*28+G*151+B*77)>>8;4.平均值法:Gray=(R+G+B)/3;5.仅取绿色:Gray=G;通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。

阈值分割的原理

阈值分割的原理

阈值分割的基本原理阈值分割是一种常见的图像处理技术,用于将图像中的目标与背景分开。

其基本原理是通过设定一个阈值,将图像中的像素根据其灰度值与阈值的大小关系进行分类,从而实现目标和背景的分割。

1. 灰度图像转换在进行阈值分割之前,首先需要将彩色图像转换为灰度图像。

这是因为彩色图像包含了RGB三个通道的信息,而在阈值分割中只考虑灰度信息。

灰度图像可以通过对彩色图像进行加权平均来获得。

常见的加权平均方法有亮度法和平均法。

亮度法通过计算每个像素点的RGB通道值的加权平均来得到灰度值:Gray = 0.299 * R + 0.587 * G + 0.114 * B其中R、G、B分别表示红、绿、蓝三个通道的取值。

2. 设定阈值设定阈值是阈值分割中最重要的一步。

阈值可以根据应用需求来确定,也可以通过试验找到最佳结果。

在设定阈值时,需要考虑两个因素:目标与背景的灰度差异和图像中的噪声。

如果目标与背景之间的灰度差异较大,可以选择较低的阈值;如果图像中存在较多噪声,可以选择较高的阈值。

设定阈值的常见方法有手动设定、直方图分析和自适应阈值法。

•手动设定:用户根据经验或直觉选择一个合适的阈值。

这种方法简单直接,但需要用户对图像有一定了解。

•直方图分析:通过分析图像的灰度直方图来确定一个合适的阈值。

可以根据直方图上的波峰和波谷来确定分割点。

•自适应阈值法:根据图像局部区域内的灰度特性来自适应地确定阈值。

常见的方法包括基于均值、基于局部方差和基于最大类间方差等。

3. 分割操作在设定了阈值之后,就可以对图像进行分割操作了。

分割操作将图像中所有像素点根据其灰度与设定阈值的大小关系进行分类。

通常情况下,将大于或等于阈值的像素点归为一类(目标),将小于阈值的像素点归为另一类(背景)。

分割操作可以通过以下公式表示:Binary(x, y) = {1, if Gray(x, y) >= Threshold; 0, if Gray(x, y) < Threshold}其中,Binary(x, y)表示二值图像中坐标为(x, y)的像素点的值,Gray(x, y)表示灰度图像中对应像素点的灰度值,Threshold表示设定的阈值。

真彩色图转灰度图及RGB转HSV

真彩色图转灰度图及RGB转HSV

《数字图像处理》实验报告(一)学号:________*********______ *名:_________***专业:机械设计制造及其自动化课序号:__________ 0 计算机科学与技术学院实验1颜色空间变换一、实验学时:4学时(本部分占实验成绩的20%)二、实验目的:1、理解并掌握颜色的原理及相互之间的转换算法;2、掌握并编程实现颜色空间的互相转换;3、学会Matlab有关图像处理的基本操作。

三、必须学习和掌握的知识点:颜色空间的特性及相互转换。

四、实验题目:1. 真彩色图像转换成8位灰度图像;2. 编程实现图像由RGB色彩空间到YUV的变换。

(注:输入为RGB空间的彩色图像,输出图像将Y、U、V三个通道分别显示)。

五、思考题:(选做,有加分)颜色空间的表示方法有很多种。

例如,常说的真彩色图像指的就是24位RGB 图像。

而CMYK颜色表示则常用于印刷、油画等。

还有很多种其他的表示方法,如HSI、HSV、YCbCr等。

它们与RGB之间均有相应的转换公式。

除了完成实验题目之外,建议大家尝试完成如下实验思考题:1、RGB→YCbCr,要求转换得到的三个通道分别显示;2、RGB→HSV,要求转换得到的三个通道分别显示;六、实验报告:请按照要求完成下面报告内容并提交相关材料。

1、请详细描述本实验的原理:1.24位真彩色图转换灰度图的原理彩色位图是由R/G/B三个分量组成,如果是24位真彩图,则每个点是由三个字节分别表示R/G/B,所以这里直接跟着图像的色彩信息;灰度图是指只含亮度信息,不含色彩信息的图象,就象我们平时看到的黑白照片:亮度由暗到明,变化是连续的。

因此,要表示灰度图,就需要把亮度值进行量化。

通常划分成0到255共256个级别,其中0最暗(全黑),255最亮(全白)。

在表示颜色的方法中,YUV的表示方法,Y分量的物理含义就是亮度,Y分量包含了灰度图的所有信息,只用Y分量就能完全能够表示出一幅灰度图来。

灰度化最大值法python算法

灰度化最大值法python算法

灰度化最大值法python算法灰度化最大值法是一种图像处理的算法,用于将彩色图像转换为灰度图像。

该算法基于像素强度的最大值,即对于每个像素,取其RGB三个通道中的最大值作为灰度值。

这种方法可以突出图像中的亮色部分,从而得到一种特殊的视觉效果。

以下是一个使用Python和OpenCV库实现灰度化最大值法的简单示例:pythonimport cv2def max_intensity_gray_scale(image_path):# 读取图像image = cv2.imread(image_path)# 检查图像是否为彩色图像if len(image.shape) != 3 or image.shape[2] != 3:raise ValueError("Input image is not a color image.")# 获取图像的高度和宽度height, width = image.shape[:2]# 创建一个空的灰度图像gray_image = cv2.Mat(height, width, cv2.CV_8UC1)# 对于每个像素,取其RGB三个通道中的最大值作为灰度值for i in range(height):for j in range(width):gray_image[i, j] = max(image[i, j][0], image[i, j][1], image[i, j][2])return gray_image# 使用方法gray_image = max_intensity_gray_scale("your_image_path.jpg")cv2.imshow("Gray Image", gray_image)cv2.waitKey(0)cv2.destroyAllWindows()这段代码首先读取一张彩色图像,然后创建一个新的灰度图像。

yuv rgb 互转 公式 及算法

yuv rgb 互转 公式 及算法

1 前言自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用的过程,所以在不同的应用领域中为了更好更准确的满足各自的需求,就出现了各种各样的色彩空间模型来量化的描述颜色。

我们比较常接触到的就包括RGB / CMYK / YIQ / YUV / HSI等等。

对于数字电子多媒体领域来说,我们经常接触到的色彩空间的概念,主要是RGB , YUV 这两种(实际上,这两种体系包含了许多种具体的颜色表达方式和模型,如sRGB, Adobe RGB, YUV422, YUV420 …), RGB是按三基色加光系统的原理来描述颜色,而YUV则是按照亮度,色差的原理来描述颜色。

即使只是RGB YUV这两大类色彩空间,所涉及到的知识也是十分丰富复杂的,自知不具备足够的相关专业知识,所以本文主要针对工程领域的应用及算法进行讨论。

2 YUV相关色彩空间模型对于YUV模型,实际上很多时候,我们是把它和YIQ / YCrCb模型混为一谈的。

实际上,YUV模型用于PAL制式的电视系统,Y表示亮度,UV并非任何单词的缩写。

YIQ模型与YUV模型类似,用于NTSC制式的电视系统。

YIQ颜色空间中的I和Q分量相当于将YUV空间中的UV分量做了一个33度的旋转。

YCbCr颜色空间是由YUV颜色空间派生的一种颜色空间,主要用于数字电视系统中。

从RGB到YCbCr的转换中,输入、输出都是8位二进制格式。

三者与RGB的转换方程如下:RGB -> YUV:实际上也就是:Y=0.30R+0.59G+0.11B ,U=0.493(B-Y) ,V=0.877(R-Y)RGB -> YIQ:RGB -> YCrCb:从公式中,我们关键要理解的一点是,UV / CbCr信号实际上就是蓝色差信号和红色差信号,进而言之,实际上一定程度上间接的代表了蓝色和红色的强度,理解这一点对于我们理解各种颜色变换处理的过程会有很大的帮助。

BMP图像由彩图变为灰度图

BMP图像由彩图变为灰度图

Date:6月21日任务:BMP真彩图像转为灰度图一,算法及公式:1,什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:浮点算法:Gray=R*0.3+G*0.59+B*0.11整数方法:Gray=(R*30+G*59+B*11)/100移位方法:Gray =(R*28+G*151+B*77)&gt;&gt;8;平均值法:Gray=(R+G+B)/3;仅取绿色:Gray=G;通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。

2,改变象素矩阵的RGB值,来达到彩色图转变为灰度图加权平均值算法:根据光的亮度特性,其实正确的灰度公式应当是R=G=B=R*0.299+G*0.587+B0.144为了提高速度我们做一个完全可以接受的近似,公式变形如下:R=G=B=(R*3+G*6+B)/103,真正的24位真彩图与8位的灰度图的区别就在于,真彩图文件中没有调色板,灰度图有调色板,真彩图中的象素矩阵是RGB值,灰度图中的象素矩阵是调色板索引值。

源代码1只简单的改变象素矩阵的RGB值,来达到彩色图转为灰度图,并没有添加调色板。

源代码2添加了调色板。

二,源代码1,//可以输入文件名的源代码,有些变量定义进行了完善#include "stdio.h"#include "stdlib.h"#include "string.h"#include "windows.h"#include "conio.h"typedef struct{unsigned char b;unsigned char r;unsigned char g;}pixel;pixel a[640][480];unsigned char aa[640][480];void main(){BITMAPFILEHEADER FILEH;BITMAPINFOHEADER INFOH;RGBQUAD RGBH[256];char name[11];char *fname[11];printf("输入需要转换的图片名:");scanf("%s",&name);*fname=name;strcat(*fname,".bmp");printf("%s",*fname);FILE *fp;if((fp=fopen(*fname,"rb"))==NULL){//if((fp=fopen(*fname,"wb"))==NULL)//防止首次进入时初始化失败//{printf("打开文件%s失败!按任意键返回主菜单!",fname);getch();exit(1);//}}printf("%s",*fname);int LEN1=sizeof(BITMAPFILEHEADER);int LEN2=sizeof(BITMAPINFOHEADER);int X,Y;printf("\nlen=%d,%d\n",LEN1,LEN2);fread(&FILEH,sizeof(BITMAPFILEHEADER),1,fp); fread(&INFOH,sizeof(BITMAPINFOHEADER),1,fp); X=INFOH.biWidth;Y=INFOH.biHeight;//printf("%d*%d",X,Y);if(FILEH.bfType!=0x4d42){fclose(fp);printf("文件头不正确,不是bmp!");exit(1);}if(INFOH.biBitCount!=24&&INFOH.biBitCount!=8) {fclose(fp);printf("信息头不正确,不是bmp!");exit(1);}//*RGBH=A;unsigned char blue,green,red,color;int j,k;if(INFOH.biBitCount==8){fread(&RGBH,sizeof(RGBQUAD),256,fp);for(j=0;j<Y;j++)for(k=0;k<X;k++){fread(&color,1,1,fp);red=RGBH[color].rgbRed;green=RGBH[color].rgbGreen;blue=RGBH[color].rgbBlue;aa[j][k]=(unsignedchar)(0.299*(float)red+0.574*(float)green+0.114*(float)blue);}}if(INFOH.biBitCount==24){for(j=0;j<Y;j++)for(k=0;k<X;k++){fread(&blue,1,1,fp);fread(&green,1,1,fp);fread(&red,1,1,fp);a[j][k].b=blue;a[j][k].g=green;a[j][k].r=red;aa[j][k]=(unsignedchar)(0.299*(float)red+0.574*(float)green+0.114*(float)blue);}}//printf("ok");fclose(fp);printf("输入输出的灰度图片名:");scanf("%s",&name);strcat(*fname,".bmp");if((fp=fopen(*fname,"wb"))==NULL){fclose(fp);printf("打开图片124.bmp失败");exit(1);}INFOH.biBitCount=8;fwrite(&FILEH,LEN1,1,fp);fwrite(&INFOH,LEN2,1,fp);int m=0;for(int i=0;i<256;i++){fwrite(&i,1,1,fp);fwrite(&i,1,1,fp);fwrite(&i,1,1,fp);fwrite(&m,1,1,fp);}for(j=0;j<Y;j++)for(k=0;k<X;k++){fwrite(&aa[j][k],1,1,fp);}fclose(fp);printf("生成灰度图%s成功!\n",*fname); }2,bmpFormat.h--------------------------------------------#ifndef _BMPTEST_H_#define _BMPTEST_H_#include <stdio.h>typedef unsigned char BYTE;typedef unsigned short WORD;typedef struct {long imageSize;long blank;long startPostition;}BmpHead;typedef struct {long length;long width;long height;WORD colorPlane;WORD bitColor;long zipFormat;long readSize;long xPels;long yPels;long colorUse;long colorImportant;}InfoHead;typedef struct {BYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved;}RGBMixPlate;#endif-------------------------------------------- create.c-------------------------------------------- #include "bmpFormat.h"#include <tiffio.h>#include <stdlib.h>int main(int argc, char *argv[]){//tiff文件涉及变量TIFF *image; //tiff文件指针uint32 width, height; //图片的宽度和高度char *buffer; //保存tiff文件中的图像灰度信息缓存tsize_t stripSize; //tiff 中图像的条大小unsigned long bufferSize; //缓存大小int stripMax, stripCount; //图像总共的条数和读条信息时的控制变量unsigned long imageOffset, result; //读文件信息时的控制变量和每次读的结果//循环控制变量unsigned int i;unsigned int j;//bmp文件涉及变量BmpHead bmphead; //bmp文件头(不包括固定信息)InfoHead infohead; //bmp信息头RGBMixPlate *color; //调色板BYTE *index; //图像数据在调色板中的索引值FILE *bmp; //bmp文件指针char bm[2]={'B','M'}; //bmp文件头中的一块固定信息,表示这是一张BMP图片‘// 打开tiff图片if((image = TIFFOpen(argv[1], "r")) == NULL){fprintf(stderr, "Could not open incoming image\n");return -1;}//获取图片的宽度和高度TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width);TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height);stripSize = TIFFStripSize (image); //每条的大小stripMax = TIFFNumberOfStrips (image); //一共有多少条imageOffset = 0; //后面读取文件信息时使用的偏移量//根据文件信息申请相应的数据空间bufferSize = TIFFNumberOfStrips (image) * stripSize;if((buffer = (char *) malloc(bufferSize)) == NULL){fprintf(stderr, "Could not allocate enough memory for the uncompressed image\n");return -1;}//读取文件中的灰度信息for (stripCount = 0; stripCount < stripMax; stripCount++){if((result = TIFFReadEncodedStrip (image, stripCount,buffer + imageOffset,stripSize)) == -1){fprintf(stderr, "Read error on input strip number %d\n", stripCount);return -1;}imageOffset += result;}//bmp文件头成员赋值bmphead.blank=0;//保留字,为0bmphead.imageSize=14+40+4*256+width*height; //图片的大小=文件头大小+信息头大小+调色板大小+实际图片大小bmphead.startPostition=14+40+4*256; //图片实际数据相对于文件头的偏移量//bmp信息头成员赋值(可参见BMP文件解析每个成员的定义)infohead.length=40;infohead.width=width;infohead.height=height;infohead.colorPlane=1;infohead.bitColor=8;infohead.zipFormat=0;infohead.readSize=width*height;infohead.xPels=400;infohead.yPels=300;infohead.colorUse=0;infohead.colorImportant=0;//申请调色板和数据域空间color=(RGBMixPlate *)malloc(sizeof(RGBMixPlate)*256);index=(BYTE *)malloc(sizeof(BYTE)*infohead.readSize);//生成256色灰度调色板for(i=0;i<256;i++){color[i].rgbBlue=i;color[i].rgbGreen=i;color[i].rgbRed=i;color[i].rgbReserved=0;}//256色灰度bmp的数据信息实际就是该灰度在相应灰度值的调色板中的颜色for(i=0;i<height;i++)for(j=0;j<width;j++)index[i*width+j]=buffer[(height-1-i)*width+j];//tiff图片是从左上到右下,bmp图片是从左下到右上//创建bmp图片bmp=fopen(argv[2],"wb");if(bmp==NULL){printf("open new file error\n");return -1;}//写入相应的数据fwrite(bm,1,2,bmp);fwrite(&bmphead,1,12,bmp);fwrite(&infohead,1,40,bmp);fwrite(color,1,256*sizeof(color),bmp);fwrite(index,1,infohead.readSize,bmp);fclose(bmp);//释放有关资源free(buffer);free(color);free(index);TIFFClose(image);fclose(bmp);return 0;}。

彩色图像工程中常用颜色空间及其转换

彩色图像工程中常用颜色空间及其转换
彩色图像工程中常用颜色空间 及其转换
彩色图像工程是涉及图像处理、计算机视觉和多媒体通信等多个领域的综合性 学科。在彩色图像工程中,颜色空间是用来描述和表示图像中颜色信息的数学 模型。不同的颜色空间适用于不同的应用场景,并在图像处理中发挥关键作用。 本次演示将介绍一些常用的颜色空间,并阐述它们的基本概念和特点,同时讨 论不同颜色空间之间的转换关系及实现方法。
参考内容
在图像处理和计算机视觉领域,彩色图像分割是一种重要的预处理步骤,其目 标是将图像分割成多个区域或对象。基于RGB颜色空间的彩色图像分割方法是 最常见的一种。
一、RGB颜色空间
RGB(Red,Green,Blue)颜色空间是彩色图像处理中最基础的色彩表示方法。 它通过三个通道——红色、绿色和蓝色,来描述像素的颜色。每个像素的RGB 值都对应于一个特定的颜色。
实现方法:首先计算色度和饱和度,然后根据色度计算红、绿、蓝的分量。
3、RGB到YUV转换
RGB到YUV的转换公式为:
Y = 0.299R + 0.587G + 0.114B U = -0.R - 0.G + 0.436B V = 0.615R 0.G - 0.*B
实现方法:根据公式直接计算Y、U、V的分量。
不同颜色空间之间的转换
在实际应用中,往往需要将图像从一种颜色空间转换到另一种颜色空间。这种 转换是有损的,可能会造成颜色的损失或变化。不同颜色空间之间的转换关系 可以通过相应的转换公式和算法来实现。下面列举几种常见的颜色空间转换方 法:
1、RGB到HSV转换
RGB到HSV的转换公式为:
H = arccos[(R-G+B)/3] / π S = max(R,G,B) - min(R,G,B) / max(R,G,B) V = max(R,G,B)

HSL与RGB转换

HSL与RGB转换

HSL与RGB转换HSL:H:Hue ⾊调S:Saturation 饱和度L:Lightness 亮度aRGB:a:alpha 透明度R:Red 红⾊G:Green 绿⾊B:Blue 蓝⾊a) RGB→HSL的算法描述。

步骤1:把RGB值转成【0,1】中数值。

步骤2:找出R,G和B中的最⼤值。

步骤3:计算亮度:L=(maxcolor + mincolor)/2步骤4:如果最⼤和最⼩的颜⾊值相同,即表⽰灰⾊,那么S定义为0,⽽H未定义并在程序中通常写成0。

步骤5:否则,根据亮度L计算饱和度S:If L<0.5, S=(maxcolor-mincolor)/(maxcolor + mincolor)If L>=0.5, S=(maxcolor-mincolor)/(2.0-maxcolor-mincolor)步骤6:计算⾊调H:If R=maxcolor, H=(G-B)/(maxcolor-mincolor)If G=maxcolor, H=2.0+(B-R)/(maxcolor-mincolor)If B=maxcolor, H=4.0+(R-G)/(maxcolor-mincolor)H=H*60.0,如果H为负值,则加360。

说明:1,由步骤3的式⼦可以看出亮度仅与图像的最多颜⾊成分和最少的颜⾊成分的总量有关。

亮度越⼩,图像越趋于⿊⾊。

亮度越⾼图像越趋于明亮的⽩⾊。

2,由步骤5的式⼦可以看出饱和度与图像的最多颜⾊成分和最少的颜⾊成分的差量有关。

饱和度越⼩,图像越趋于灰度图像。

饱和度越⼤,图像越鲜艳,给⼈的感觉是彩⾊的,⽽不是⿊⽩灰的图像。

3,⾊调觉得了⼈对图像的不同的颜⾊感受。

4,从第6步的计算看,H分成0~6区域。

RGB颜,⾊空间是⼀个⽴⽅体⽽HSL颜⾊空间是两个六⾓形锥体,其中的L是RGB⽴⽅体的主对⾓线。

因此,RGB⽴⽅体的顶点:红、黄、绿、青、蓝和品红就成为HSL六⾓形的顶点,⽽数值0~6就告诉我们H在哪个部分。

数据图像处理实验报告

数据图像处理实验报告
{
//对y方向进行快速付立叶变换
FFT(&TD[w * i], &FD[w * i], wp);
}
//保存变换结果
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
TD[i + h * j] = FD[j + w * i];
}
}
for(i = 0; i < w; i++)
YCBCR空间图像中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。主要的子采样格式有YCbCr 4:2:0、YCbCr 4:2:2和YCbCr 4:4:4。
2、图像灰度变换与代码编写
a)在VC6.0环境下打开“医学图像处理系统”代码,进行编译调试,打开实验前准备的医学图像,进行灰度变换曲线调整如下图,观察图像进行灰度调整后的效果;
实验二 图像的FFT变换实验
一、实验目的:
1、练习Visual C++的一些FFT变换的算法实现方式;
2、编写Visual C++关于图像的FFT变换函数的编写和调试;
3、熟悉FFT变换在图像处理中的作用及功能;
4、熟悉FFT变换后的显示基本算法;
5、学会编写图像的FFT变换相关函数:
二、实验原理:
}
return TRUE;
}
3、灰度运算对于图像处理的作用,对照观察灰度变换前后的图像,了解各种灰度变换的作用
使图像加亮使图像减暗
提高图像对比度降低图像对比度
灰度级切片
四、思考题
1、要设计一个功能完善的图像灰度变换处理软件,需要在那些功能上进行完善和设计;

数字图像处理2-真彩色,灰度图像,索引色图像等的相互转化

数字图像处理2-真彩色,灰度图像,索引色图像等的相互转化

timg 真彩色timg1 灰度图像timg2 索引色图像(64色)timg3 二值图像(阈值为0.5)这里从网上找到了timg真彩色图像作为本次作业中进行数字处理的图像。

首先在ps中调整了图像模式,并进行了另存为,生成了timg1与timg2,又在MATLAB中将灰度图像转化为了二值图像timg3,其中阈值为0.5。

这一步操作的代码如下:A = imread('timg1.jpg');B = im2bw(A, 0.5);imshow(B)imwrite(B,'timg3.jpg');随后我们来对每个图像imread的返回值进行观察。

对于timg处理的程序如下:A = imread('timg.jpg');disp(A);whos Aimshow(A)由于disp显示数据过多,这里不放原始数据了。

其具体内容为3个数组,每个数组都是320*200的,分别代表图片中每个像素的rgb值。

而whos语句显示出的内容如下:Bytes Class Name Size192000 uint8A 200x320x3其中200*320*3说明图像像素为200*320而且为rgb格式,有3个矩阵。

192000为图片大小,而其rgb值是用unit8即8位无符号整数存储,0-255的值代表了某一点像素某一颜色分量的强度。

同理,若将上述程序中的timg改为timg1灰度图像,显示出来的矩阵则只有一个,大小仍为200*320但是每个点的数值则代表对应像素的灰度值。

whos语句显示出的内容如下:Name SizeBytes Class64000 u int8A 200x320由于灰度图像只需要存储灰度而不是rgb3个分量,其大小便没有最后的*3,因此其大小也只为timg的1/3。

对于索引图进行的操作与其他图像不同,由于其本身存储的是索引值,需要导入索引表才能还原原本的图像,因此程序如下:[IM, map] = imread('timg2.png','png');disp(IM);IMrgb(:,:,:) = ind2rgb(IM,map);whos IMrgbimshow(IMrgb)这里如果直接imshow原本图像的话会根据灰度图像的方式显示错误的图像,因此采用了一个ind2rgb函数通过之前导入的索引表和索引值矩阵将图像恢复为rgb图像矩阵。

关于色彩模型(RGB、CMYK、HSV、CIE)的数学计算机基础及色彩量化与分色技术

关于色彩模型(RGB、CMYK、HSV、CIE)的数学计算机基础及色彩量化与分色技术

经典论坛» Adobe Photoshop 专栏[教学] 关于色彩模型(RGB、CMYK、HSV、CIE)的数学计算机基础及色彩量化与分色技术作者:wangruisc [楼主]无意发现论坛以前有人关注过关于几种色彩模型的相互计算机转化问题,正好手头有点资料,所以想整理出来,跟大家分享一下。

因为涉及到计算机图象处理的基础,枯燥是难免的,如果有数学公式实在不懂,还请自己克服。

颜色模型可见光电磁波波长范围很大,但是只有波长在400~760nm这样很小范围内的电磁波,才能使人产生视觉,感到明亮和颜色。

把这个波长范围内的电磁波叫可见光。

三原色1931年,国际照明委员会(CIE)规定用波长为700nm、546.1nm和435.8nm的单色光作为红(R)、绿(G)、蓝(B)三原色。

任意彩色的颜色方程为:F=a(R)+b(G)+r(B)a,b,r>=0a,b,r是红、绿、蓝三色的混合比例,一般称为三色系数。

所谓颜色模型指的是某个三维颜色空间中的一个可见光子集。

它包含某个色彩域的所有色彩。

任何一个色彩域都只是可见光的子集,任何一个颜色模型都无法包含所有的可见光。

RGB颜色模型RGB颜色模型是三维直角坐标颜色系统中的一个单位正方体如图在正方体的主对角线上,各原色的量相等,产生由暗到亮的白色,即灰度。

(0,0,0)为黑,(1,1,1)为白,正方体的其他6个角点分别为红、黄、绿、青、蓝和品红。

RGB颜色模型构成的颜色空间是CIE原色空间的一个真子集。

RGB颜色模型通常用于彩色阴极射线管和彩色光栅图形显示器。

RGB三原色是加性原色。

(未完,待续,后面很多,只是公式和示意图格式转化麻烦)[ 本帖最后由wangruisc 于2007-7-8 00:50 编辑]1# 发表于2007-7-7 23:49作者:wangruisc [楼主]CMY颜色模型CMY颜色模型是以红、绿、蓝三色的补色青(Cyan)、品红(Magenta)、黄(Yellow)为原色构成的颜色模型。

将RGB值转换为灰度值的简单算法

将RGB值转换为灰度值的简单算法

将RGB值转换为灰度值的简单算法RGB是如何转换为灰度的?这是让⼈困惑已久的⼀道难题。

1、RGB复合通道转灰度:转换后的⾊阶值只与RGB空间有关,⽽与作为⽬的地的灰度空间⽆关。

也就是说,只要当前的RGB空间不变,不管将灰度空间设置为哪种,转换后的⾊阶值都是⼀样的。

2、RGB中的单通道转灰度:转换后的⾊阶值不仅于RGB空间有关,⽽且还与作为⽬的地的灰度空间有关。

但是,其灰度值K 只于RGB⾊阶有关,⽽与RGB空间及灰度空间⽆关。

其值与RGB⾊阶X的关系为:K=1-X/2553、在RGB模式中,修改颜⾊设置中的RGB⼯作空间,将影响复合通道的外观和灰度K值,以及单通道的灰度值。

但是,不会影响到单通道的外观。

4、在RGB模式中,如果修改颜⾊设置中的灰度空间,将影响到单⾊通道的外观以及单⾊通道、复合通道的灰度K值,但是,不会影响到复合通道的外观。

以上见解供⼤家讨论!⼀、RGB向灰度转换的原理RGB向灰度转换时,是以LAB模式为中介的(这和PS中关于LAB模式的⼀贯解释是完全吻合的)。

其基本的流程是:⾸先将RGB转换为LAB,然后在LAB中去⾊,使A、B均为零,并依此⽣成⼀个RGB等值的灰阶,最后再根据该灰阶向灰度空间转换。

由此可见,转换为灰度的等值RGB只与原来的RGB空间有关,⽽与作为⽬标空间的灰度空间⽆关。

⼆、灰阶的计算不同的RGB空间,灰阶的计算公式有所不同,常见的⼏种RGB空间的计算灰阶的公式如下:1、简化 sRGB IEC61966-2.1 [gamma=2.20]Gray = (R^2.2 * 0.2126 + G^2.2 * 0.7152 + B^2.2 * 0.0722)^(1/2.2)2、 Adobe RGB (1998) [gamma=2.20]Gray = (R^2.2 * 0.2973 + G^2.2 * 0.6274 + B^2.2 * 0.0753)^(1/2.2)3、Apple RGB [gamma=1.80]Gray = (R^1.8 * 0.2446 + G^1.8 * 0.6720 + B^1.8 * 0.0833)^(1/1.8)4、ColorMatch RGB [gamma=1.8]Gray = (R^1.8 * 0.2750 + G^1.8 * 0.6581 + B^1.8 * 0.0670)^(1/1.8)5、简化 KODAK DC Series Digital Camera [gamma=2.2]Gray = (R^2.2 * 0.2229 + G^2.2 * 0.7175 + B^2.2 * 0.0595)^(1/2.2)三、灰度K的计算由于RGB空间与灰度空间都有其相互独⽴的灰度系数(即GAMMA,设RGB空间的GAMMA为GAMMA1,灰度空间的GAMMA 为GAMMA2),因此,就有了两种意义上的灰度K,⼀种是在RGB空间中相对于GAMMA1的灰度K1,另⼀种是转换到灰度空间后,相对于灰度空间GAMMA2的灰度K2(K2实际上就是经过GAMMA转换后的灰度)。

yuv422转灰度公式

yuv422转灰度公式

yuv422转灰度公式
YUV422是一种颜色编码方式,其中Y表示亮度分量,U和V表
示色度分量。

要将YUV422转换为灰度,可以使用以下公式:
灰度值 = 0.299 R + 0.587 G + 0.114 B.
其中,R、G、B分别表示YUV422中的Y、U、V分量。

这个公式
是根据人眼对不同颜色的敏感程度来计算的,红色对应的权重较高,绿色次之,蓝色最低。

另外,需要注意的是YUV422采样结构的特点,它的色度分量U
和V的采样率比亮度分量Y要低。

在进行YUV422转灰度时,需要考
虑到这种采样结构对色度分量的处理。

总的来说,将YUV422转换为灰度需要考虑颜色分量的权重以及
采样结构,以确保得到准确的灰度图像。

颜色空间转化和归一化

颜色空间转化和归一化

颜色空间转化和归一化颜色空间转化和归一化是图像处理中常用的技术,它将图像中的颜色信息从一个颜色空间转换为另一个颜色空间,以便更好地进行后续处理。

在本文中,我们将介绍颜色空间转化和归一化的基本概念和应用。

一、颜色空间的基本概念颜色空间是指颜色在三维空间中的表示方式,即通过三个分量来描述一个颜色。

常用的颜色空间包括RGB、CMYK、HSV等。

1. RGB颜色空间RGB颜色空间是一种将颜色表示为红色、绿色和蓝色分量的三维空间,它是电子设备和计算机颜色显示的标准。

2. CMYK颜色空间CMYK颜色空间是一种将颜色表示为青色、品红色、黄色和黑色分量的四维空间,它主要应用于印刷品的颜色调整和控制。

3. HSV颜色空间HSV颜色空间是一种将颜色表示为色调、饱和度和亮度分量的三维空间,它常用于图像处理、计算机视觉和计算机图形学等领域。

二、颜色空间的转化颜色空间的转化是将一个颜色空间中的颜色信息转化为另一个颜色空间中的颜色信息。

下面介绍RGB、CMYK和HSV颜色空间之间的转化方法。

1. RGB到CMYK转化RGB到CMYK的转化可以通过以下公式进行计算:K = min(1 - R, 1 - G, 1 - B)C = (1 - R - K) / (1 - K)M = (1 - G - K) / (1 - K)Y = (1 - B - K) / (1 - K)2. RGB到HSV转化RGB到HSV的转化可以通过以下公式进行计算:V = max(R, G, B)S = (V - min(R, G, B)) / VH = 0, (G - B) / (max(R, G, B) - min(R, G, B))H = 120 + (B - R) / (max(R, G, B) - min(R, G, B))H = 240 + (R - G) / (max(R, G, B) - min(R, G, B))三、颜色空间的归一化颜色空间的归一化是将图像中的颜色信息进行统一,以便更好地进行后续处理。

从RGB色转为灰度色算法

从RGB色转为灰度色算法

从RGB⾊转为灰度⾊算法⼀、基础 对于彩⾊转灰度,有⼀个很著名的⼼理学公式:Gray = R*0.299 + G*0.587 + B*0.114⼆、整数算法 ⽽实际应⽤时,希望避免低速的浮点运算,所以需要整数算法。

注意到系数都是3位精度的没有,我们可以将它们缩放1000倍来实现整数运算算法:Gray = (R*299 + G*587 + B*114 + 500) / 1000 RGB⼀般是8位精度,现在缩放1000倍,所以上⾯的运算是32位整型的运算。

注意后⾯那个除法是整数除法,所以需要加上500来实现四舍五⼊。

就是由于该算法需要32位运算,所以该公式的另⼀个变种很流⾏:Gray = (R*30 + G*59 + B*11 + 50) / 100 但是,虽说上⼀个公式是32位整数运算,但是根据80x86体系的整数乘除指令的特点,是可以⽤16位整数乘除指令来运算的。

⽽且现在32位早普及了(AMD64都出来了),所以推荐使⽤上⼀个公式。

三、整数移位算法 上⾯的整数算法已经很快了,但是有⼀点仍制约速度,就是最后的那个除法。

移位⽐除法快多了,所以可以将系数缩放成 2的整数幂。

习惯上使⽤16位精度,2的16次幂是65536,所以这样计算系数:0.299 * 65536 = 19595.264 ≈ 195950.587 * 65536 + (0.264) = 38469.632 + 0.264 = 38469.896 ≈ 384690.114 * 65536 + (0.896) = 7471.104 + 0.896 = 7472 可能很多⼈看见了,我所使⽤的舍⼊⽅式不是四舍五⼊。

四舍五⼊会有较⼤的误差,应该将以前的计算结果的误差⼀起计算进去,舍⼊⽅式是去尾法: 写成表达式是:Gray = (R*19595 + G*38469 + B*7472) >> 16 2⾄20位精度的系数:Gray = (R*1 + G*2 + B*1) >> 2Gray = (R*2 + G*5 + B*1) >> 3Gray = (R*4 + G*10 + B*2) >> 4Gray = (R*9 + G*19 + B*4) >> 5Gray = (R*19 + G*37 + B*8) >> 6Gray = (R*38 + G*75 + B*15) >> 7Gray = (R*76 + G*150 + B*30) >> 8Gray = (R*153 + G*300 + B*59) >> 9Gray = (R*306 + G*601 + B*117) >> 10Gray = (R*612 + G*1202 + B*234) >> 11Gray = (R*1224 + G*2405 + B*467) >> 12Gray = (R*2449 + G*4809 + B*934) >> 13Gray = (R*4898 + G*9618 + B*1868) >> 14Gray = (R*9797 + G*19235 + B*3736) >> 15Gray = (R*19595 + G*38469 + B*7472) >> 16Gray = (R*39190 + G*76939 + B*14943) >> 17Gray = (R*78381 + G*153878 + B*29885) >> 18Gray = (R*156762 + G*307757 + B*59769) >> 19Gray = (R*313524 + G*615514 + B*119538) >> 20 仔细观察上⾯的表格,这些精度实际上是⼀样的:3与4、7与8、10与11、13与14、19与20 所以16位运算下最好的计算公式是使⽤7位精度,⽐先前那个系数缩放100倍的精度⾼,⽽且速度快:Gray = (R*38 + G*75 + B*15) >> 7 其实最有意思的还是那个2位精度的,完全可以移位优化:Gray = (R + (WORD)G<<1 + B) >> 2========================在计算机中使⽤最多的 RGB 彩⾊空间,分别对应红、绿、蓝三种颜⾊;通过调配三个分量的⽐例来组成各种颜⾊。

RGB图和HSI图转换

RGB图和HSI图转换

摘要所谓彩色模型就是指摸个三维颜色空间中的一个可见光子集。

它包含某个颜色域的所有颜色。

例如,RGB颜色模型就是三维直角坐标颜色系统的一个单位正方体。

颜色模型的用途是在某个颜色域内方便的制定颜色,由于每一个颜色域都是可见光的子集,所以任何一个颜色模型都无法包含所有得可见光。

在大多数的颜色图形显示设备一般都是使用红、绿、蓝三原色,我们的真实感图形学中的主要的颜色模型也是RGB模型,但是红、绿、蓝颜色模型用起来不太方便,它与直观的颜色概念如色调、饱和度和亮度等没有直接的联系。

计算机彩色显示器显示色彩的原理与彩色电视机一样,都是采用R、G、B 相加混色的原理。

通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光尔产生色彩的。

这种色彩的表示方法称为RGB色彩空间表示。

HSV颜色模型中颜色的参数分别是:色彩,纯度,明度。

HSV模型的三维表示是一种比拟直观的颜色模型,在许多图形编辑工具中应用比拟广泛。

如Photoshop 等等。

但这也决定了他不适合使用在光照模型中。

YCbCr是DVD、摄像机、数字电视等消费类视频产品中,常用的色彩编码方案。

YCbCr有时也会称为YCC。

YCbCr在模拟分量视频中也常被称为YPbpr。

关键词:颜色模型;RGB;HSV;YCbCr目录1 课程设计目的....................................................................................... 错误!未定义书签。

2 课程设计要求 (1)3 MATLAB简介 (2)MATLAB主要功能 (2)3.2 MATLAB优势 (2)3.2.1 工作平台和编程环境 (2)程序语言 (3)3.2.3 科学计算机数据处理能力 (3)3.2.4图形处理功能 (3)3.2.5模块集合工具箱 (4)3.3 MATLAB函数与数据类型 (4)4 设计方案 (4)5 程序编码 (5)5.1 将RGB图像与HSI图像互相转换 (5)将RGB图像转换到NTSC图像 (8)6 仿真结果 (9)7 结论 (11)8 参考文献 (12)1 课程设计目的彩色模型也称为彩色空间或彩色系统,是描述色彩的一种方法。

灰度色彩模式介绍

灰度色彩模式介绍

灰度色彩模式介绍灰度色彩模式介绍引导语:RGB色彩中,在RGB值相等的情况下显示的就是灰度色彩模式,以下是店铺整理的灰度色彩模式介绍,欢迎参考阅读!Photoshop有色彩管理功能,这主要用在印刷品制作上。

我们目前针对网页设计,因此可以选择“显示器颜色”,如下左图。

对于PhotoshopCS版本,可选择“色彩管理关闭”,如下右图。

可从菜单【编辑颜色设置】打开色彩管理,在顶部的“设置”中选择“色彩管理关闭”。

如下图:在前面讲述RGB色彩,以及在颜色调板选取颜色的时候,有没有想到过RGB值相等的情况下是什么颜色?那是一个灰度色。

如下左图。

现在我们将颜色调板切换到灰度方式,可看到灰度色谱,如下右图。

所谓灰度色,就是指纯白、纯黑以及两者中的一系列从黑到白的过渡色。

我们平常说所的黑白照片、黑白电视,实际上都应该称为灰度照片、灰度电视才确切。

灰度色中不包含任何色相,即不存在红色、黄色这样的颜色。

灰度隶属于RGB色域(色域指色彩范围)。

我们已经知道,在RGB模式中三原色光各有256个级别。

由于灰度的形成是RGB数值相等。

而RGB数值相等的排列组合是256个,那么灰度的'数量就是256级。

其中除了纯白和纯黑以外,还有254种中间过渡色。

纯黑和纯白也属于反转色。

灰度的通常表示方法是百分比,范围从0%到100%。

Photoshop中只能输入整数,在Illustrator和GoLive允许输入小数百分比。

注意这个百分比是以纯黑为基准的百分比。

与RGB正好相反,百分比越高颜色越偏黑,百分比越低颜色越偏白。

灰度最高相当于最高的黑,就是纯黑。

灰度最低相当于最低的黑,也就是“没有黑”,那就是纯白。

如下2图。

既然灰度和RGB一样,是有数值的,那么这个数值和百分比是怎么换算的?比如18%的灰度,是256级灰度中的哪一级呢?是否是256×18%呢?没错,灰度的数值和百分比的换算就是相乘后的近似值,由于灰度与RGB是“黑白颠倒”的,所以18%的灰度等于82%的RGB亮度。

动态差分阈值法

动态差分阈值法

动态差分阈值法动态差分阈值法是一种广泛应用于图像处理和计算机视觉领域的算法。

该算法通过调整阈值来实现对图像中物体的分割,以消除背景噪声和平滑轮廓。

下面将分步骤介绍该算法的实现过程。

第一步:灰度化灰度化是将图像从RGB颜色空间转换到灰度颜色空间的过程。

该过程使得算法处理的图像数据量更小,并且在保留有用信息的同时,可以减少数据维度。

在该算法的实现中,使用的是加权平均法,即将RGB三个通道的像素值加权平均,得到图像的灰度值。

第二步:滤波处理滤波处理是为了去除图像中的噪声和过度平滑的像素。

在动态差分阈值法中,使用的是高斯滤波器,它通过叠加多个高斯函数来平滑图像,并在保留边缘信息的同时,消除高频噪声。

对于一般情况,高斯滤波器的大小视图像的分辨率而定。

第三步:求取差分差分操作是该算法的关键步骤之一。

该步骤通过计算像素与相邻像素的差异值来确定图像中的边缘位置。

在动态差分阈值法中,使用的是一阶差分算子,在计算差分过程中,需要保证差分结果的有效性,即排除噪声的干扰。

第四步:动态阈值处理动态阈值处理是根据图像的差分值来进行分割处理的过程,该过程的目的是去除噪声和保留有限的边缘信息。

在动态差分阈值法中,采用的是一种自适应线性阈值化算法,通过设置参数来调整阈值的大小,从而实现对图像的自适应分割。

第五步:二值化最后一步是将阈值化后的图像进行二值化,即将阈值化后的像素按照设定的阈值进行二进制划分。

该过程通常涉及到的计算能力较小,因此算法的速度会比较快。

综上所述,动态差分阈值法在图像分割中发挥了重要的作用。

该算法的实现过程相对简单,通过灰度化、滤波处理、差分计算、动态阈值处理和二值化处理五个步骤,就能够得到一幅满足分割要求的二值化图像。

该算法在很多场合下都得到了广泛的应用,包括检测人脸、检测车辆等。

颜色校正算法

颜色校正算法

颜色校正算法一、引言颜色校正算法是计算机图形学中的一个重要技术,旨在修正由于光照、摄像设备、显示器等因素引起的颜色偏差。

在计算机图像处理和计算机视觉领域,颜色校正算法被广泛应用于图像增强、图像重建、色彩匹配等方面。

本文将介绍几种常见的颜色校正算法及其原理。

二、直方图均衡化直方图均衡化是一种简单而有效的颜色校正算法。

它通过对图像的像素值分布进行调整,使图像的亮度分布更加均匀。

具体步骤如下: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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

从RGB色转为灰度色算法
一、基础
对于彩色转灰度,有一个很著名的心理学公式:
Gray = R*0.299 + G*0.587 + B*0.114
二、整数算法
而实际应用时,希望避免低速的浮点运算,所以需要整数算法。

注意到系数都是3位精度的没有,我们可以将它们缩放1000倍来实现整数运算算法:
Gray = (R*299 + G*587 + B*114 + 500) / 1000 RGB一般是8位精度,现在缩放1000倍,所以上面的运算是32位整型的运算。

注意后面那个除法是整数除法,所以需要加上500来实现四舍五入。

就是由于该算法需要32位运算,所以该公式的另一个变种很流行:
Gray = (R*30 + G*59 + B*11 + 50) / 100 但是,虽说上一个公式是32位整数运算,但是根据80x86体系的整数乘除指令的特点,是可以用16位整数乘除指令来运算的。


且现在32位早普及了(AMD64都出来了),所以推荐使用上一个公式。

三、整数移位算法
上面的整数算法已经很快了,但是有一点仍制约速度,就是最后的那个除法。

移位比除法快多了,所以可以将系数缩放成2的整数幂。

习惯上使用16位精度,2的16次幂是65536,所以这样计算系数:
0.299 * 65536 = 19595.264 ≈ 19595
0.587 * 65536 + (0.264) = 38469.632 + 0.264 = 38469.896 ≈ 38469
0.114 * 65536 + (0.896) = 7471.104 + 0.896 = 7472
可能很多人看见了,我所使用的舍入方式不是四舍五入。

四舍五入会有较大的误差,应该将以前的计算结果的误差一起计算进去,舍入方式是去尾法:
写成表达式是:
Gray = (R*19595 + G*38469 + B*7472) >> 16 2至20位精度的系数:
Gray = (R*1 + G*2 + B*1) >> 2
Gray = (R*2 + G*5 + B*1) >> 3
Gray = (R*4 + G*10 + B*2) >> 4
Gray = (R*9 + G*19 + B*4) >> 5
Gray = (R*19 + G*37 + B*8) >> 6
Gray = (R*38 + G*75 + B*15) >> 7
Gray = (R*76 + G*150 + B*30) >> 8
Gray = (R*153 + G*300 + B*59) >> 9
Gray = (R*306 + G*601 + B*117) >> 10
Gray = (R*612 + G*1202 + B*234) >> 11
Gray = (R*1224 + G*2405 + B*467) >> 12
Gray = (R*2449 + G*4809 + B*934) >> 13
Gray = (R*4898 + G*9618 + B*1868) >> 14
Gray = (R*9797 + G*19235 + B*3736) >> 15
Gray = (R*19595 + G*38469 + B*7472) >> 16
Gray = (R*39190 + G*76939 + B*14943) >> 17
Gray = (R*78381 + G*153878 + B*29885) >> 18
Gray = (R*156762 + G*307757 + B*59769) >> 19
Gray = (R*313524 + G*615514 + B*119538) >> 20 仔细观察上面的表格,这些精度实际上是一样的:3与4、7与8、10与11、13与14、19与20
所以16位运算下最好的计算公式是使用7位精度,比先前那个系数缩放100倍的精度高,而且速度快:
Gray = (R*38 + G*75 + B*15) >> 7
其实最有意思的还是那个2位精度的,完全可以移位优化:
Gray = (R + (WORD)G<<1 + B) >> 2
========================
在计算机中使用最多的RGB 彩色空间,分别对应红、绿、蓝三种颜色;通过调配三个分量的比例来组成各种颜色。

一般可以使用 1 、2 、4 、8 、16 、24 、32 位来存储这三颜色,不过现在一个分量最大是用8 位来表示,最大值是255 ,对于32 位的颜色,高8 位是用来表示通明度的。

彩色图一般指16 位以上的图。

灰度图有一个特殊之处就是组成颜色的三个分量相等;而一般灰度图是8 位以下。

在彩色电视机系统中,通常使用一种叫YUV 的色彩空间,其中Y 表示亮度信号;也就是这个YUV 空间解决了彩色电视机和黑白电视机的兼容问题。

对于人眼来说,亮度信号是最敏感的,如果将彩色图像转换为灰度图像,仅仅需要转换保存亮度信号就可以。

从RGB 到YUV 空间的Y 转换公式为:
Y = 0.299R+0.587G+0.114B
在WINDOWS 中,表示16 位以上的图和以下的图有点不同;16 位以下的图使用一个调色板来表示选择具体的颜色,调色板的每个单元是 4 个字节,其中一个透明度;而具体的像素值存储的是索引,分别是1 、2 、4 、8 位。

16 位以上的图直接使用像素表示颜色。

================================================= 那么如何将彩色图转换为灰度图呢?
灰度图中有调色板,首先需要确定调色板的具体颜色取值。

我们前面提到了,灰度图的三个分量相等。

当转换为8 位的时候,调色板中有256 个颜色,每个正好从0 到255 个,三个分量都相等。

当转换为4 位的时候,调色板中16 个颜色,等间隔平分255 个颜色值,三个分量都相等。

当转换为2 位的时候,调色板中4 个颜色,等间隔平分255 个颜色,三个分量相等。

当转换为1 位的时候,调色板中两个颜色,是0 和255 ,表示黑和白。

将彩色转换为灰度时候,按照公式计算出对应的值,该值实际上是亮度的级别;亮度从0 到255 ;由于不同的位有不同的亮度级别,所以Y 的具体取值如下:
Y = Y/ (1<<(8- 转换的位数));
最后一点需要注意,得到Y 值存放方式是不同的;分别用对应的位数来存储对应的Y 值。

//----------------------------------------------------------
// RGB565 转8位灰度图
//----------------------------------------------------------
TUint8 gm_red,gm_green,gm_blue;
TInt16 *des_ptr;
TInt16 *pt;
pt = (TInt16 *)p8; //RGB565流
for(TInt j=0;j<h;j++)
{
for(TInt i = w;i>0;i--)
{
gm_red = ((*(TInt16 *)pt) & 0xF800) >> 8;
gm_green = ((*(TInt16 *)pt) & 0x07E0) >> 3;
gm_blue = ((*(TInt16 *)pt) & 0x001F) << 3;
p[0] = ( TUint8 )((gm_red*77 + gm_green*150 +
gm_blue*29+128) / 256);
p++;
pt++;
}
}
p = qt; //灰度图指针
一道面试题
写一个函数,将一个32位RGB像素的色值转为灰度,RGB转灰度的公式:Grey=.03*red+0.59*green+0.11*blue;RGB像素格式(左边最高位,右边最低位):
00000000RRRRRRRRGGGGGGGGBBBBBBBB.
unsigned int ToGrey(unsigned int rgb)
{ 请填}
答案
unsigned int ToGrey(unsigned int rgb)
{
unsigned int blue = (rgb & 0x000000FF)>>0;
unsigned int green = (rgb & 0x0000FF00) >> 8;
unsigned int red = (rgb & 0x00FF0000) >> 16;
printf("\nred=%d,green=%d,blue=%d\n",red,green,blue); return ( red*38 + green * 75 + blue * 15 )>>7;
}。

相关文档
最新文档