图像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, ...
随机推荐
- String、StringBuffer、StringBuilder有什么区别
区别 先说说String和StringBuffer/StringBuilder: String是标准的不可变类,是一个字符串常量池,并且声明的对象在方法中是唯一存在的. StringBuffer/St ...
- JavaScript学习笔记(一)——JS速览
第一章 JS速览 1 限制时间处理事件 <script> setTomeout(wakeUpUser,5000); function wakeUpUser() { alert(" ...
- [C++] Solve "Launch Failed. Binary not found." error on Eclipse
This error is that the default lanch configuration is not being created for this project. To solve i ...
- Python常用模块之hashlib
Python里面的hashlib模块提供了很多加密的算法,这里介绍一下hashlib的简单使用事例,用hashlib的md5算法加密数据 import hashlib hash = hashlib.m ...
- sprint2 团队贡献分
团队名:在考虑 团队贡献分: 102 杨晶晶:17 106 邹育萍:18 114 纪焓:16 116 黄敏鹏:28 117 郑培轩:26 138 曾昱霖:15 最新项目的github地址: https ...
- Scrum立会报告+燃尽图(十一月十四日总第二十二次):分配β阶段任务
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- PyCharm如何设置源代码字体的大小
改源代码大小 1.File→Settings→Editor→Colors&Fonts→Font 2.首先得需要Save as一个Scheme,接下来才可以修改字体,名字可以任意取 改运行字体的 ...
- Spring 依赖的Jar包简介
Spring 依赖的Jar包简介 Spring的依赖关系 依赖关系分组 JAR文件 说 明 ant ant.jar, ant-junit.jar, ant-launcher.jar Spring采用A ...
- python 动态获取当前运行的类名和函数名的方法
一.使用内置方法和修饰器方法获取类名.函数名 python中获取函数名的情况分为内部.外部,从外部的情况好获取,使用指向函数的对象,然后用__name__属性 复制代码代码如下: def a():pa ...
- SpringBoot与Swagger2整合
一.Swagger简介与优势 相信各位在公司写API文档数量应该不少,当然如果你还处在自己一个人开发前后台的年代,当我没说,如今为了前后台更好的对接,还为了以后交接方便,都有要求写API文档. Swa ...