⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yuv - rgb 格式分析及快速查表算法设计 - colorant的专栏 - csdn博客.htm

📁 YUV - RGB 格式分析及快速查表算法设计 .rar
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0061)http://blog.csdn.net/colorant/archive/2007/12/03/1913162.aspx -->
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>YUV / RGB 格式分析及快速查表算法设计 - colorant的专栏 - CSDN博客</TITLE>
<META content=彩色蚂蚁 name=author>
<META content=Csdn name=Copyright>
<META content=分析色彩空间模型原理,设计快速转换算法 name=description>
<META http-equiv=Content-Type content="text/html; charset=utf-8"><LINK 
href="http://profile.csdn.net/colorant/picture/1.ico" rel="Shortcut Icon"><LINK 
media=all 
href="YUV - RGB 格式分析及快速查表算法设计 - colorant的专栏 - CSDN博客.files/Cogitation_1.css" 
type=text/css rel=stylesheet><LINK media=all 
href="YUV - RGB 格式分析及快速查表算法设计 - colorant的专栏 - CSDN博客.files/csdn_favbykimi.css" 
type=text/css rel=stylesheet>
<SCRIPT 
src="YUV - RGB 格式分析及快速查表算法设计 - colorant的专栏 - CSDN博客.files/jquery-1.2.3.pack.js" 
type=text/javascript></SCRIPT>

<SCRIPT 
src="YUV - RGB 格式分析及快速查表算法设计 - colorant的专栏 - CSDN博客.files/jquery.highlighter.js" 
type=text/javascript></SCRIPT>

<SCRIPT 
src="YUV - RGB 格式分析及快速查表算法设计 - colorant的专栏 - CSDN博客.files/highlighter.js" 
type=text/javascript></SCRIPT>
<LINK title=RSS href="http://feeds.feedsky.com/csdn.net/colorant" 
type=application/rss+xml rel=alternate>
<META content="MSHTML 6.00.2900.3527" name=GENERATOR></HEAD>
<BODY id=defaultuser>
<DIV id=csdnblog_allwrap>
<FORM id=Form1 name=Form1 action=1913162.aspx method=post><INPUT 
id="&#13;&#10;__VIEWSTATE" type=hidden name=__VIEWSTATE> 
<DIV id=csdnblog_midwrap>
<DIV id=csdnblog_header>
<H1><A id=Header1_HeaderTitle 
href="http://blog.csdn.net/colorant/">colorant的专栏</A></H1>
<H2>彩色蚂蚁的Linux博客</H2>
<UL id=personalnav>
  <LI><A href="http://hi.csdn.net/my.html" target=_blank>欢迎 
zhenwenxian!</A></LI>
  <LI><A href="http://writeblog.csdn.net/Signout.aspx">退出</A></LI>
  <LI><A href="http://blog.csdn.net/zhenwenxian">我的博客</A></LI>
  <LI><A href="http://writeblog.csdn.net/configure.aspx" 
  target=_blank>配置</A></LI>
  <LI><A href="http://writeblog.csdn.net/PostEditPlain.aspx" 
  target=_blank>写文章</A></LI>
  <LI><A href="http://writeblog.csdn.net/PostList.aspx" 
  target=_blank>文章管理</A></LI>
  <LI><A href="http://blog.csdn.net/" target=_blank>博客首页</A></LI></UL>
<UL id=blogsearchsty>
  <LI><INPUT class=bolgsearch id=inputSearch 
onkeydown="return keyb(event)"></LI>
  <LI class=selectsty><SELECT id=Search_ddlSearchScope 
  name=Search:ddlSearchScope><OPTION value=all selected>全站</OPTION><OPTION 
    value=colorant>当前博客</OPTION></SELECT></LI>
  <LI><INPUT class=bolggobtn onclick=checkNull() type=button value=搜索></LI></UL>
<UL id=menu>
  <LI><A href="http://hi.csdn.net/colorant">空间</A></LI>
  <LI><A class=on href="http://blog.csdn.net/colorant">博客</A></LI>
  <LI><A 
  href="http://hi.csdn.net/colorant/profile/contactlist/1.html">好友</A></LI>
  <LI><A href="http://album.hi.csdn.net/" target=_blank>相册</A></LI>
  <LI><A class=last 
  href="http://hi.csdn.net/colorant/profile/notebook/1.html">留言</A></LI></UL></DIV>
<DIV id=csdnblog_content>
<DIV class=gutter>
<DIV class=default_contents>
<DIV class=user_article>
<SCRIPT 
src="YUV - RGB 格式分析及快速查表算法设计 - colorant的专栏 - CSDN博客.files/LoadFeedbackCount.js" 
type=text/javascript></SCRIPT>

<H1 class=title_txt><IMG height=16 alt=原创 
src="YUV - RGB 格式分析及快速查表算法设计 - colorant的专栏 - CSDN博客.files/authorship.gif" 
width=15 border=0>&nbsp;YUV / RGB 格式分析及快速查表算法设计<CITE 
class=fav_csdnstylebykimi><A class=fav_csdnstylebykimi title=收藏到我的网摘中,并分享给我的朋友 
href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏</A></CITE></H1>
<DIV class=blogstory>
<SCRIPT>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</SCRIPT>

<DIV align=center><STRONG><SPAN style="FONT-SIZE: 22pt"></SPAN></STRONG></DIV>
<DIV><STRONG><FONT size=6><SPAN>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" 
align=center><FONT size=3><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作者:刘旭晖</SPAN><FONT 
face="Times New Roman"> <SPAN lang=EN-US><A href="mailto:colorant@163.com"><FONT 
color=#000080>colorant@163.com</FONT></A> </SPAN></FONT><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转载请注明出处</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" 
align=center><FONT color=#000080 size=3><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><A 
href="http://blog.csdn.net/colorant/">http://blog.csdn.net/colorant/</A></SPAN></FONT></P></SPAN></FONT></STRONG></DIV>
<DIV><STRONG><FONT size=6><SPAN>1<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>前言</FONT></STRONG></DIV>
<DIV>&nbsp;</DIV>
<DIV>自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用的过程,所以在不同的应用领域中为了更好更准确的满足各自的需求,就出现了各种各样的色彩空间模型来量化的描述颜色。我们比较常接触到的就包括 
RGB / CMYK / YIQ / YUV / HSI等等。</DIV>
<DIV>&nbsp;</DIV>
<DIV>对于数字电子多媒体领域来说,我们经常接触到的色彩空间的概念,主要是RGB , 
YUV这两种(实际上,这两种体系包含了许多种具体的颜色表达方式和模型,如sRGB, Adobe RGB, YUV422, YUV420 …), 
RGB是按三基色加光系统的原理来描述颜色,而YUV则是按照 亮度,色差的原理来描述颜色。</DIV>
<DIV>&nbsp;</DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>即使只是RGB 
YUV这两大类色彩空间,所涉及到的知识也是十分丰富复杂的,在下自知不具备足够的相关专业知识,所以本文主要针对工程领域的应用及算法进行讨论。</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><FONT size=6><SPAN>2<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>YUV相关色彩空间模型</FONT></STRONG></DIV>
<DIV><STRONG><FONT size=5><SPAN>2.1<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>YUV 与 YIQ YcrCb</FONT></STRONG></DIV>
<DIV>对于YUV模型,实际上很多时候,我们是把它和YIQ / YCrCb模型混为一谈的。</DIV>
<DIV>实际上,YUV模型用于PAL制式的电视系统,Y表示亮度,UV并非任何单词的缩写。</DIV>
<DIV>YIQ模型与YUV模型类似,用于NTSC制式的电视系统。YIQ颜色空间中的I和Q分量相当于将YUV空间中的UV分量做了一个33度的旋转。</DIV>
<DIV>YCbCr颜色空间是由YUV颜色空间派生的一种颜色空间,主要用于数字电视系统中。从RGB到YCbCr的转换中,输入、输出都是8位二进制格式。</DIV>
<DIV>三者与RGB的转换方程如下:</DIV>
<DIV>RGB -&gt; YUV</DIV>
<DIV><IMG alt="" src=""></DIV>
<DIV>实际上也就是:</DIV>
<DIV style="TEXT-INDENT: 18pt"><SPAN 
style="FONT-SIZE: 9pt; COLOR: black; LETTER-SPACING: 0pt">Y=0.30R+0.59G+0.11B 
</SPAN><SPAN 
style="FONT-SIZE: 9pt; COLOR: black; LETTER-SPACING: 0pt">,</SPAN><SPAN 
style="FONT-SIZE: 9pt; COLOR: black; LETTER-SPACING: 0pt"> U=0.493(B</SPAN><SPAN 
style="FONT-SIZE: 9pt; COLOR: black; LETTER-SPACING: 0pt">-</SPAN><SPAN 
style="FONT-SIZE: 9pt; COLOR: black; LETTER-SPACING: 0pt">Y) </SPAN><SPAN 
style="FONT-SIZE: 9pt; COLOR: black; LETTER-SPACING: 0pt">,</SPAN><SPAN 
style="FONT-SIZE: 9pt; COLOR: black; LETTER-SPACING: 0pt"> V=0.877(R</SPAN><SPAN 
style="FONT-SIZE: 9pt; COLOR: black; LETTER-SPACING: 0pt">-</SPAN><SPAN 
style="FONT-SIZE: 9pt; COLOR: black; LETTER-SPACING: 0pt">Y)</SPAN></DIV>
<DIV>&nbsp;</DIV>
<DIV>RGB -&gt; YIQ</DIV>
<DIV><IMG alt="" src=""></DIV>
<DIV>&nbsp;</DIV>
<DIV>RGB -&gt; YCrCb</DIV>
<DIV><IMG alt="" src=""></DIV>
<DIV>从公式中,我们关键要理解的一点是,UV / 
CbCr信号实际上就是蓝色差信号和红色差信号,进而言之,实际上一定程度上间接的代表了蓝色和红色的强度,理解这一点对于我们理解各种颜色变换处理的过程会有很大的帮助。</DIV>
<DIV>我们在数字电子多媒体领域所谈到的YUV格式,实际上准确的说,是以YcrCb色彩空间模型为基础的具有多种存储格式的一类颜色模型的家族(包括YUV444 
/ YUV422 / YUV420 / 
YUV420P等等)。并不是传统意义上用于PAL制模拟电视的YUV模型。这些YUV模型的区别主要在于UV数据的采样方式和存储方式,这里就不详述。</DIV>
<DIV>而在Camera Sensor中,最常用的YUV模型是 
YUV422格式,因为它采用4个字节描述两个像素,能和RGB565模型比较好的兼容。有利于Camera Sensor和Camera 
controller的软硬件接口设计。</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><FONT size=6><SPAN>3<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>YUV2RGB快速算法分析</FONT></STRONG></DIV>
<DIV>这里指的YUV实际是YcrCb了 8&nbsp;) 
YUV2RGB的转换公式本身是很简单的,但是牵涉到浮点运算,所以,如果要实现快速算法,算法结构本身没什么好研究的了,主要是采用整型运算或者查表来加快计算速度。</DIV>
<DIV>首先可以推导得到转换公式为:</DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; R = Y + 1.4075 
*</SPAN>(V-128)</DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; G = Y – 0.3455 *</SPAN>(U –128) 
– 0.7169 *(V –128)</DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B = Y + 1.779 *</SPAN>(U – 
128)</DIV>
<DIV><STRONG><FONT size=5><SPAN>3.1<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>整型算法</FONT></STRONG></DIV>
<DIV>要用整型运算代替浮点运算,当然是要用移位的办法了,我们可以很容易得到下列算法:</DIV>
<DIV>&nbsp;</DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u = YUVdata[UPOS] - 
128;</SPAN></DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v = YUVdata[VPOS] - 
128;</SPAN></DIV>
<DIV>&nbsp;<SPAN>&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></DIV>
<DIV style="MARGIN-LEFT: 21pt">rdif = v + ((v * 103) &gt;&gt; 8);</DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invgdif = ((u * 88) &gt;&gt; 8) 
+((v * 183) &gt;&gt; 8);</SPAN></DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bdif = u +( (u*198) &gt;&gt; 
8);</SPAN></DIV>
<DIV>&nbsp;</DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r = YUVdata[YPOS] + 
rdif;</SPAN></DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g = YUVdata[YPOS] - 
invgdif;</SPAN></DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = YUVdata[YPOS] + 
bdif;</SPAN></DIV>
<DIV>&nbsp;</DIV>
<DIV>为了防止出现溢出,还需要判错计算的结果是否在0-255范围内,做类似下面的判断。</DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (r&gt;255)</SPAN></DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
r=255;</SPAN></DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (r&lt;0)</SPAN></DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
r=0;</SPAN></DIV>
<DIV>要从RGB24转换成RGB565数据还要做移位和或运算:</DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RGBdata[1] =( (r &amp; 
0xF8)&nbsp;| ( g &gt;&gt; 5) );</SPAN></DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RGBdata[0] =( ((g &amp; 0x1C) 
&lt;&lt; 3) | ( b &gt;&gt; 3) );</SPAN></DIV>
<DIV><STRONG><FONT size=5><SPAN>3.2<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>部分查表法</FONT></STRONG></DIV>
<DIV>查表法首先可以想到的就是用查表替代上述整型算法中的乘法运算。</DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rdif = 
fac_1_4075[u];</SPAN></DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invgdif = fac_m_0_3455[u] + 
fac_m_0_7169[v];</SPAN></DIV>
<DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bdif = 
fac_1_779[u];</SPAN></DIV>
<DIV>这里一共需要4个1维数组,下标从0开始到255,表格共占用约1K的内存空间。uv可以不需要做减128的操作了。在事先计算对应的数组元素的值的时候计算在内就好了。</DIV>
<DIV>对于每个像素,部分查表法用查表替代了2次减法运算和4次乘法运算,4次移位运算。但是,依然需要多次加法运算和6次比较运算和可能存在的赋值操作,相对第一种方法运算速度提高并不明显。</DIV>
<DIV><STRONG><FONT size=5><SPAN>3.3<SPAN 
style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></SPAN>完全查表法</FONT></STRONG></DIV>
<DIV>那么是否可以由YUV直接查表得到对应的RGB值呢?乍一看似乎不太可能,以最复杂的G的运算为例,因为G与YUV三者都相关,所以类似 
G=YUV2G[Y][U][V]这样的算法,一个三维下标尺寸都为256的数组就需要占用2的24次方约16兆空间,绝对是没法接受的。所以目前多数都是采用部分查表法。</DIV>
<DIV>但是,如果我们仔细分析就可以发现,对于G我们实际上完全没有必要采用三维数组,因为Y只与UV运算的结果相关,与UV的个体无关,所以我们可以采用二次查表的方法将G的运算简化为对两个二维数组的查表操作,如下:</DIV>
<DIV>G = yig2g_table[ y ][ uv2ig_table[ u ][ v ] ];</DIV>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -