// 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格式互转的更多相关文章

  1. avi视频格式转yuv格式与播放yuv视频

    因为要用到yuv格式视频.而眼下仅仅有avi格式的视频,所以须要转换,而且opencv不支持yuv编码的视频播放.所以须要转换为rgb编码.而后播放.写了两个程序.以供參考: 1,avi格式视频转yu ...

  2. YUV格式分析

    转自:http://www.cnblogs.com/armlinux/archive/2012/02/15/2396763.html Andrew Huang <bluedrum@163.com ...

  3. YUV格式具体解释

    YUV是指亮度參量和色度參量分开表示的像素格式,而这样分开的优点就是不但能够避免相互干扰,还能够减少色度的採样率而不会对图像质量影响太大.YUV是一个比較笼统地说法,针对它的详细排列方式,能够分为非常 ...

  4. YUV格式全解

    YUV是指亮度参量和色度参量分开表示的像素格式,而这样分开的好处就是不但可以避免相互干扰,还可以降低色度的采样率而不会对图像质量影响太大.YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多 ...

  5. YUV格式详解【转】

    转自:http://blog.csdn.net/searchsun/article/details/2443867 [-] YUV格式解析1播放器project2 YUV 采样 表面定义 YUV格式解 ...

  6. Android中使用MediaCodec硬件解码,高效率得到YUV格式帧,快速保存JPEG图片(不使用OpenGL)(附Demo)

    MediaCodec的使用demo: https://github.com/vecio/MediaCodecDemo https://github.com/taehwandev/MediaCodecE ...

  7. 图像处理之基础---yuv420及其rgb,bayer, yuv, RGB的相互转换详解

    YUV格式解析1(播放器——project2) 根据板卡api设计实现yuv420格式的视频播放器 打开*.mp4;*.264类型的文件,实现其播放. 使用的视频格式是YUV420格式   YUV格式 ...

  8. Android 音视频编解码——RGB与YUV格式转换

    一.RGB模型与YUV模型 1.RGB模型 我们知道物理三基色分别是红(Red).绿(Green).蓝(Blue).现代的显示器技术就是通过组合不同强度的红绿蓝三原色,来达成几乎任何一种可见光的颜色. ...

  9. YUV格式与RGB格式

    YUV420介绍: YUV420格式是指,每个像素都保留一个Y(亮度)分量,而在水平方向上,不是每行都取U和V分量,而是一行只取U分量,则其接着一行就只取V分量,以此重复(即4:2:0, 4:0:2, ...

随机推荐

  1. Python列表推导式和嵌套的列表推导式

    列表推导式提供了一个更简单的创建列表的方法.常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列. 例如,假设我们想创建一个平方 ...

  2. 百度地图之自动提示--autoComplete

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 在Windows2008下添加iscsi存储出现磁盘Offine(The disk is offine because of policy set by an adminstrator)的解决方法

    打开CMD命令行输入如下命令: DISKPART.EXE DISKPART> san SAN Policy : Offline Shared DISKPART> san policy=On ...

  4. Jenkins 自动化测试

    学习 Jenkins 自动化测试的系列文章 Robot Framework 概念 Robot Framework 安装 Pycharm + Robot Framework 环境搭建 Robot Fra ...

  5. CF刷刷水题找自信1

    CF 1108A Two distinct points 题目意思:给你两个线段的起点和终点,让你给出两个不同的点,这两点分别处于两个不同的线段之中.解题思路:题目说如果存在多种可能的点,随意一组答案 ...

  6. 互评Alpha版本——可以低头,但没必要——取件帮

    基于NABCD评论作品,及改进建议: 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 随着电商平台的发展,越来越多的人选择网购,但是东师的一部分快递网点不在校内,需要走很长的一 ...

  7. PSP1130

    PSP时间图: 类型 任务 开始时间 结束时间 净时间 中断时间 日期 开会 开会 16:17 16:50 33 0 20171027 开会 开会 17:00 17:22 22 0 20171028 ...

  8. vim 编码方式的设置

    和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括UCS-2.UTF-8 等流行的 Unicode 编码方式.然而不幸的是,和很多来自 Linux 世界的软件一样,这需要 ...

  9. java包名命名规范

    Java的包名都有小写单词组成,类名首字母大写:包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类.以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现. 由于 ...

  10. Spring 依赖的Jar包简介

    Spring 依赖的Jar包简介 Spring的依赖关系 依赖关系分组 JAR文件 说 明 ant ant.jar, ant-junit.jar, ant-launcher.jar Spring采用A ...