图像RGB格式与YUV格式互转
// rgb2yuv.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" #define Level 256 //直方图bin数
#define SIZEX 176 //image列尺寸
#define SIZEY 256 //image列尺寸
#define READ 0
#define WRITE 1 unsigned char image_in[SIZEY*SIZEX*];
unsigned char image_out[SIZEY*SIZEX*];
float Y[SIZEX*SIZEY], U[SIZEX*SIZEY], V[SIZEX*SIZEY];
float Y_out[SIZEX*SIZEY]; void GetFileName(char *name , char *message)
{
if((NULL == name) || (NULL == message))
{
return ;
} printf("%s" , message);
scanf("%s" , name);
} FILE * FileOpen(char *fileName , int mode)
{
FILE *filePoint ;
char *option = "" ; if(mode == READ)
{
option = "r+b";
}
else if(mode == WRITE)
{
option = "w+b";
} if(NULL == (filePoint = fopen(fileName , option)))
{
printf("File Open Fail!\n");
} return filePoint ;
} void ReadImageData(FILE *filePoint)
{
if(filePoint == NULL)
{
return ;
} int y_count ;
unsigned char temp = ; for(y_count = ; y_count < SIZEX*SIZEY ; y_count++)
{
fscanf(filePoint , "%c" , &temp);
image_in[y_count] = temp ;
}
} void Histogram(long *hist)
{
int i , num ; for(num = ; num < Level ; num++)
{
hist[num] = ;
} for(i = ; i < SIZEX*SIZEY ; i++)
{
num = Y[i];
hist[num]++;
} for(num = ; num < Level ; num++)
{
printf("%d \n" , hist[num]);
}
} void Equalization(long *hist ,long *q)
{
int i,n;
long sum=; for(i=;i<;i++)
{
sum += hist[i]; /* find distribution */
q[i]=(int) (sum*Level/((float)SIZEY*SIZEX));
}
} void Calculate(long *q)
{
int i, y, data; for(i=;i<SIZEX*SIZEY;i++){
data = Y[SIZEX*SIZEY];
Y_out[SIZEX*SIZEY] = q[data];
}
} void WriteImageData(FILE *file_p)
{
int Y_Count; for(Y_Count = ; Y_Count < SIZEX*SIZEY*; Y_Count++)
{
fprintf(file_p, "%c", image_out[Y_Count]);
}
} int _tmain(int argc, _TCHAR* argv[])
{
FILE *in , *out; char source[],destin[];
char *message1="Input Data File Name : " ;
char *message2="Output Data File Name : " ; int i ;
long hist[Level] = {} ;
long q[Level] = {} ;
unsigned char Red[SIZEX*SIZEY] = {} ;
unsigned char Green[SIZEX*SIZEY] = {} ;
unsigned char Blue[SIZEX*SIZEY] = {} ; /*读取源文件名*/
GetFileName(source , message1);
GetFileName(destin , message2); /*打开源文件/目的文件*/
in = FileOpen(source , READ);
out = FileOpen(destin , WRITE); /*读取源文件数据*/
ReadImageData(in); /*RGB2YUV*/
for(i = ; i < SIZEX*SIZEY; i++)
{
/*Get RGB Data*/
Red[i] = image_in[i*] ;
Green[i] = image_in[i*+] ;
Blue[i] = image_in[i*+] ; /*RGB to YUV*/
Y[i] = 0.3*Red[i] + 0.59*Green[i] + 0.11*Blue[i] ;
U[i] = (Blue[i]-Y[i]) * 0.493;
V[i] = (Red[i]-Y[i]) * 0.877;
} /*直方图信息统计*/
Histogram(hist); /*直方图均衡*/
Equalization(hist , q); /*直方图计算*/
Calculate(q); for(i=; i < SIZEX*SIZEY; i++)
{
Red[i] = Y_out[i] + 0.956*U[i] + 0.621*V[i];
Green[i] = Y_out[i] + 0.272*U[i] + 0.647*V[i];
Blue[i] = Y_out[i] + 1.1061*U[i] + 1.703*V[i];
} for(i=; i < SIZEY*SIZEX; i++)
{ image_out[i*] = Red[i];
image_out[i*+] = Green[i];
image_out[i*+] = Blue[i];
} WriteImageData(out);
fcloseall(); return ;
}
示例图片:
sample.jpg: UV分量:

图像RGB格式与YUV格式互转的更多相关文章
- avi视频格式转yuv格式与播放yuv视频
因为要用到yuv格式视频.而眼下仅仅有avi格式的视频,所以须要转换,而且opencv不支持yuv编码的视频播放.所以须要转换为rgb编码.而后播放.写了两个程序.以供參考: 1,avi格式视频转yu ...
- YUV格式分析
转自:http://www.cnblogs.com/armlinux/archive/2012/02/15/2396763.html Andrew Huang <bluedrum@163.com ...
- YUV格式具体解释
YUV是指亮度參量和色度參量分开表示的像素格式,而这样分开的优点就是不但能够避免相互干扰,还能够减少色度的採样率而不会对图像质量影响太大.YUV是一个比較笼统地说法,针对它的详细排列方式,能够分为非常 ...
- YUV格式全解
YUV是指亮度参量和色度参量分开表示的像素格式,而这样分开的好处就是不但可以避免相互干扰,还可以降低色度的采样率而不会对图像质量影响太大.YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多 ...
- YUV格式详解【转】
转自:http://blog.csdn.net/searchsun/article/details/2443867 [-] YUV格式解析1播放器project2 YUV 采样 表面定义 YUV格式解 ...
- Android中使用MediaCodec硬件解码,高效率得到YUV格式帧,快速保存JPEG图片(不使用OpenGL)(附Demo)
MediaCodec的使用demo: https://github.com/vecio/MediaCodecDemo https://github.com/taehwandev/MediaCodecE ...
- 图像处理之基础---yuv420及其rgb,bayer, yuv, RGB的相互转换详解
YUV格式解析1(播放器——project2) 根据板卡api设计实现yuv420格式的视频播放器 打开*.mp4;*.264类型的文件,实现其播放. 使用的视频格式是YUV420格式 YUV格式 ...
- Android 音视频编解码——RGB与YUV格式转换
一.RGB模型与YUV模型 1.RGB模型 我们知道物理三基色分别是红(Red).绿(Green).蓝(Blue).现代的显示器技术就是通过组合不同强度的红绿蓝三原色,来达成几乎任何一种可见光的颜色. ...
- YUV格式与RGB格式
YUV420介绍: YUV420格式是指,每个像素都保留一个Y(亮度)分量,而在水平方向上,不是每行都取U和V分量,而是一行只取U分量,则其接着一行就只取V分量,以此重复(即4:2:0, 4:0:2, ...
随机推荐
- PHP自定义生成二维码跳转地址
比较简单的一款PHP自定义生成二维码跳转地址,手机端微信扫码,自动跳转到定义好的链接.支持自定义生成二维码尺寸.间距等. 鼠标悬浮显示二维码弹出层,离开后消失.js实现,代码如下: $(fu ...
- 【转】: 塞尔达组在GDC2017演讲的文字翻译:创新的勇气
大家好,我是藤林秀麿,以导演的身份参与<荒野之息>的制作,感谢大家的出席.我曾经作为设计者和导演制作了诸多塞尔达游戏(大地与时空之章.缩小帽.四支剑.幻影沙漏.天空之剑),回首望去,我已经 ...
- Jenkins 自动化测试
学习 Jenkins 自动化测试的系列文章 Robot Framework 概念 Robot Framework 安装 Pycharm + Robot Framework 环境搭建 Robot Fra ...
- jpa的@Query中"?"占位符的使用小坑
今天使用@Query自定义查询语句,出现了一个错误: java.lang.IllegalArgumentException: Parameter with that position [1] did ...
- 20181120-4 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 01
此作业要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2409 版本控制地址 https://git.coding.net/lg ...
- python 为什么没有自增自减符
>>> b = 5 >>> a = 5 >>> id(a) 162334512 >>> id(b) 162334512 > ...
- 团队作业the end
GitHub 王德钊 李镇平 陈启昌 黄益颂 汪倍民 演示动态图:为避免现场演示翻车,各个团队需要给出项目各个功能点运行的git图. 还在肝: 分工协作:团队的成员如何分工协作的?对项目的贡献如何(用 ...
- CSS中px和em属性的特点与区别
详解px和em的特点和区别象素px是我们在定义CSS中经常用到的尺寸大小单位,而em在国外网站中经常被使用,px和em之间究竟有什么区别和特点呢?◆px像素(Pixel),相对长度单位.像素px是相对 ...
- LR之Java Vuser II
最近项目待压测的服务端协议使用的是java的Netty框架开发,而传输的业务数据使用了google protobuf进行序列化,然后通过tcp数据流与客户端通讯.这一次的压测脚本决定使用LR的java ...
- mysql中一些表选项
表选项列表 表选项就是,创建一个表的时候,对该表的整体设定,主要有如下几个: charset = 要使用的字符编码, engine = 要使用的存储引擎(也叫表类型), auto_increment ...