// 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. html5shiv 是一个针对 IE 浏览器的 HTML5 JavaScript 补丁,目的是让 IE 识别并支持 HTML5 元素。

    html5shiv 是一个针对 IE 浏览器的 HTML5 JavaScript 补丁,目的是让 IE 识别并支持 HTML5 元素. 各版本html5shiv.js CDN网址:https://ww ...

  2. Polycarp and Letters(set首战!)

    Description Polycarp loves lowercase letters and dislikes uppercase ones. Once he got a string s con ...

  3. Alpha阶段事后诸葛亮会议记录

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2324 组名:可以低头,但没必要 组长:付佳 组员:张俊余  李文涛  孙 ...

  4. TensorFlow:NameError: name ‘input_data’ is not defined

    在运行TensorFlow的MNIST实例时,第一步 import tensorflow.examples.tutorials.mnist.input_data mnist = input_data. ...

  5. SQL Server数据库复制

    事务复制 事务复制是一种复制类型,对订阅服务器上应用的初始数据快照,然后当发布服务器上发生数据修改时,将捕获到个别的事务并传播到订阅服务. 事务复制的原理是先将发布服务器数据库中的初始快照发送到各订阅 ...

  6. Eclipse 如何安装反编译插件

    安装反编译插件 1.Help——Eclipse Marketplace 2.输入 Decompiler 搜索并安装此插件 3.根据提示无脑下一步,安装好,重启后(如果还是无法编译,需要把默认打开cla ...

  7. lintcode-477-被围绕的区域

    477-被围绕的区域 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满. 样例 给出二维矩阵: X X X X X O O X X X O X X O ...

  8. C#高级编程 (第六版) 学习 第四章:继承

    第四章 继承 1,继承的类型 实现继承: 一个类派生于一个基类型,拥有该基类型所有成员字段和函数. 接口继承 一个类型只继承了函数的签名,没有继承任何实现代码.   2,实现继承 class MyDe ...

  9. Node.js系列——(1)安装配置与基本使用

    1.安装 进入下载地址 小编下载的是msi文件,下一步下一步傻瓜式安装. 打印个hello看看: 2.REPL 全称Read Eval Print Loop,即交互式解释器,可以执行读取.执行.打印. ...

  10. (转)Elasticsearch search-guard 插件部署

    我之前写了ELK+shield的部署文档,由于shield是商业收费的,很多人都推崇开源项目search-guard来做ELK的安全组件,准确来说是elasticsearch的安全组件.search- ...