日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【性能优化】优化笔记之一:图像RGB与YUV转换优化

發布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【性能优化】优化笔记之一:图像RGB与YUV转换优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要介紹如何優化您自己的CODE,實現軟件的加速。我們一個圖象模式識別的項目,需要將RGB格式的彩色圖像先轉換成黑白圖像。圖像轉換的公式如下:

?

Y = 0.299 * R + 0.587 * G + 0.114 * B

?

圖像尺寸640*480*24bit,RGB圖像已經按照RGBRGB順序排列的格式,放在內存里面了。以下是輸入和輸出的定義:

?

#define XSIZE 640 #define YSIZE 480 #define IMGSIZE XSIZE * YSIZEtypedef struct RGB {unsigned char R;unsigned char G;unsigned char B;}RGB; struct RGB in[IMGSIZE]; //需要計算的原始數據 unsigned char out[IMGSIZE]; //計算后的結果

?

優化原則:圖像是一個 2D數組,我用一個一維數組來存儲。編譯器處理一維數組的效率要高過二維數組。 第一步,先寫一個代碼:

?

void calc_lum() {int i;for(i = 0; i < IMGSIZE; i++){double r,g,b,y;unsigned char yy;r = in[i].r;g = in[i].g;b = in[i].b;y = 0.299 * r + 0.587 * g + 0.114 * b;yy = y;out[i] = yy;} }

?

這大概是能想得出來的最簡單的寫法了,實在看不出有什么毛病,好了,編譯一下跑一跑吧。這個代碼分別用vc6.0和gcc編譯,生成2個版本,分別在pc上和我的embedded system上面跑。速度多少?在PC上,由于存在硬件浮點處理器,CPU頻率也夠高,計算速度為20秒。我的embedded system,沒有以上2個優勢,浮點操作被編譯器分解成了整數運算,運算速度為120秒左右。

去掉浮點運算

上面這個代碼還沒有跑,我已經知道會很慢了,因為這其中有大量的浮點運算。只要能不用浮點運算,一定能快很多。Y = 0.299 * R + 0.587 * G + 0.114 * B;這個公式怎么能用定點的整數運算替代呢?0.299 * R可以如何化簡?

?

Y = 0.299 * R + 0.587 * G + 0.114 * B; Y = D + E + F; D = 0.299 * R; E = 0.587 * G; F = 0.114 * B;

我們就先簡化算式 D吧! RGB的取值范圍都是 0~255,都是整數,只是這個系數比較麻煩,不過這個系數可以表示為:0.299 = 299 / 1000;所以?D = ( R * 299) / 1000;

?

?

Y = (R * 299 + G * 587 + B * 114) / 1000

這一下,能快多少呢? Embedded system上的速度為 45秒; PC上的速度為 2秒;

?

0.299 * R可以如何化簡

?

Y = 0.299 * R + 0.587 * G + 0.114 * B; Y = (R * 299 + G * 587 + B * 114) / 1000;

這個式子好像還有點復雜,可以再砍掉一個除法運算。前面的算式D可以這樣寫:

?

?

0.299=299/1000=1224/4096

所以? D = (R * 1224) / 4096

Y=(R*1224)/4096+(G*2404)/4096+(B*467)/4096

再簡化為:

Y=(R*1224+G*2404+B*467)/4096

?

這里的/4096除法,因為它是2的N次方,所以可以用移位操作替代,往右移位12bit就是把某個數除以4096了。

?

void calc_lum() {int i;for(i = 0; i < IMGSIZE; i++){int r,g,b,y;r = 1224 * in[i].r;g = 2404 * in[i].g;b = 467 * in[i].b;y = r + g + b;y = y >> 12; //這里去掉了除法運算out[i] = y;} }

?

這個代碼編譯后,又快了20%。雖然快了不少,還是太慢了一些,20秒處理一幅圖像。

查表方式

我們回到這個式子:

?

Y = 0.299 * R + 0.587 * G + 0.114 * B; Y=D+E+F; D=0.299*R; E=0.587*G; F=0.114*B;

RGB的取值有文章可做, RGB的取值永遠都大于等于 ,小于等于 255,我們能不能將 D, E, F都預先計算好呢?然后用查表算法計算呢?我們使用 3個數組分別存放 DEF的 256種可能的取值,然后......

?

查表數組初始化

?

int D[256],F[256],E[256]; void table_init( ){int i;for(i=0;i<256;i++){D[i]=i*1224; D[i]=D[i]>>12;E[i]=i*2404; E[i]=E[i]>>12; F[i]=i*467; F[i]=F[i]>>12;} }void calc_lum(){int i;for(i = 0; i < IMGSIZE; i++){int r,g,b,y;r = D[in[i].r];//查表g = E[in[i].g];b = F[in[i].b];y = r + g + b;out[i] = y;} }

?

這一次的成績把我嚇出一身冷汗,執行時間居然從30秒一下提高到了2秒!在PC上測試這段代碼,眼皮還沒眨一下,代碼就執行完了。一下提高15倍,爽不爽?

繼續優化.很多embedded system的32bit CPU,都至少有2個ALU,能不能讓2個ALU都跑起來?

?

void calc_lum(){int i;for(i = 0; i < IMGSIZE; i += 2){ //一次并行處理2個數據int r,g,b,y,r1,g1,b1,y1;r = D[in[i].r];//查表 //這里給第一個ALU執行g = E[in[i].g];b = F[in[i].b];y = r + g + b;out[i] = y;r1 = D[in[i + 1].r];//查表 //這里給第二個ALU執行g1 = E[in[i + 1].g];b1 = F[in[i + 1].b];y = r1 + g1 + b1;out[i + 1] = y;} }

2個 ALU處理的數據不能有數據依賴,也就是說:某個 ALU的輸入條件不能是別的 ALU的輸出,這樣才可以并行。這次成績是 1秒。查看這個代碼:

?

int D[256],F[256],E[256]; //查表數組 void table_init(){int i;for(i=0;i<256;i++) {D[i]=i*1224; D[i]=D[i]>>12;E[i]=i*2404; E[i]=E[i]>>12; F[i]=i*467; F[i]=F[i]>>12;} }

到這里,似乎已經足夠快了,但是我們反復實驗,發現,還有辦法再快!可以將

?

int D[256],F[256],E[256]; //查表數組

更改為

unsigned short D[256],F[256],E[256]; //查表數組

?

這是因為編譯器處理int類型和處理unsigned short類型的效率不一樣。再改動

?

inline void calc_lum(){int i;for(i = 0; i < IMGSIZE; i += 2){ //一次并行處理2個數據int r,g,b,y,r1,g1,b1,y1;r = D[in[i].r];//查表 //這里給第一個ALU執行g = E[in[i].g];b = F[in[i].b];y = r + g + b;out[i] = y;r1 = D[in[i + 1].r];//查表 //這里給第二個ALU執行g1 = E[in[i + 1].g];b1 = F[in[i + 1].b];y = r1 + g1 + b1;out[i + 1] = y;} }

將函數聲明為 inline,這樣編譯器就會將其嵌入到母函數中,可以減少 CPU調用子函數所產生的開銷。這次速度: 0.5秒。 其實,我們還可以飛出地球的!如果加上以下措施,應該還可以更快: 1)?把查表的數據放置在 CPU的高速數據 CACHE里面; 2)把函數 calc_lum()用匯編語言來寫 .其實, CPU的潛力是很大的, 1)?不要抱怨你的 CPU,記住一句話:“只要功率足夠,磚頭都能飛!” 2)同樣的需求,寫法不一樣,速度可以從 120秒變化為 0.5秒,說明 CPU的潛能是很大的!看你如何去挖掘。

RGB到YUV的轉換算法做以總結。

Y =?? 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V =? 0.615R - 0.515G - 0.100B

?

#deinfe SIZE 256 #define XSIZE 640 #define YSIZE 480#define IMGSIZE XSIZE * YSIZEtypedef struct RGB{unsigned char r;unsigned char g;unsigned char b;}RGB;struct RGB in[IMGSIZE]; unsigned char out[IMGSIZE * 3]; unsigned short Y_R[SIZE],Y_G[SIZE],Y_B[SIZE],U_R[SIZE],U_G[SIZE],U_B[SIZE],V_R[SIZE],V_G[SIZE],V_B[SIZE]; //查表數組 void table_init(){int i;for(i = 0; i < SIZE; i++){Y_R[i] = (i * 1224) >> 12; //YY_G[i] = (i * 2404) >> 12; Y_B[i] = (i * 467) >> 12;U_R[i] = (i * 602) >> 12; //UU_G[i] = (i * 1183) >> 12; U_B[i] = (i * 1785) >> 12;V_R[i] = (i * 2519) >> 12; //VV_G[i] = (i * 2109) >> 12; V_B[i] = (i * 409) >> 12;} } inline void calc_lum(){int i;for(i = 0; i < IMGSIZE; i += 2) { out[i] = Y_R[in[i].r] + Y_G[in[i].g] + Y_B[in[i].b]; //Yout[i + IMGSIZE] = U_B[in[i].b] - U_R[in[i].r] - U_G[in[i].g]; //Uout[i + 2 * IMGSIZE] = V_R[in[i].r] - V_G[in[i].g] - V_B[in[i].b]; //V out[i + 1] = Y_R[in[i + 1].r] + Y_G[in[i + 1].g] + Y_B[in[i + 1].b]; //Yout[i + 1 + IMGSIZE] = U_B[in[i + 1].b] - U_R[in[i + 1].r] - U_G[in[i + 1].g]; //Uout[i + 1 + 2 * IMGSIZE] = V_R[in[i + 1].r] - V_G[in[i + 1].g] - V_B[in[i + 1].b]; //V} }

?

這種算法應該是非??斓牧?

===========================================================轉載請注明出處:http://blog.csdn.net/songzitea/article/details/10474207
===========================================================

?

?

總結

以上是生活随笔為你收集整理的【性能优化】优化笔记之一:图像RGB与YUV转换优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本a级黄 | 久久女同| 男女午夜免费视频 | 亚洲欧美日韩国产一区二区 | 国产精品三级久久久久久电影 | 国内久久| 久热网 | 中文字幕av第一页 | 日韩在线视频播放 | 人人干人人插 | 成人精品黄段子 | 成人区人妻精品一区 | 色婷婷九月 | 神马久久网| 亚洲天堂2013 | 国产精品久久久久久久久久久久久久久久久久 | 亚洲天堂日韩在线 | 鲁丝一区二区三区 | 欧美日韩激情视频 | 久久久精品中文字幕麻豆发布 | 欧美日韩1区2区3区 亚洲日本精品视频 | 亚洲精品国产成人久久av盗摄 | 在线观看一二三区 | 亚洲精品视频在线播放 | www.精品在线 | 国产精品久久久久久久妇 | eeuss国产一区二区三区黑人 | av噜噜在线观看 | 午夜黄色网址 | 欧美成人午夜免费视在线看片 | 在线观看一二三区 | 欧洲在线视频 | 大尺度做爰呻吟舌吻情头 | 怡红院最新网址 | 免费看a网站| 中国精品一区二区 | 免费av观看网站 | 91成人短视频在线观看 | 色多多入口| 日日麻批免费视频播放 | 久操国产| 九色视频国产 | 亚洲在线一区二区三区 | 亚洲国产精一区二区三区性色 | 美女裸体跪姿扒开屁股无内裤 | 91九色视频 | 日韩精品一线二线三线 | 久久视频99| 天天操天天干天天舔 | 极品福利视频 | 99精品久久久久久久 | 亚洲一区二区三区不卡视频 | 欧美日韩一区二区视频观看 | yy6080久久| a级黄色在线观看 | 国产在线欧美在线 | 婷婷综合网 | 高清无码一区二区在线观看吞精 | 中文字幕.com | 丁香激情婷婷 | 日韩免费福利 | 国产午夜精品免费一区二区三区视频 | 亚洲色图3p| 麻豆蜜桃wwww精品无码 | 色窝网 | 国产精品2区 | 99久久精品免费看国产交换 | 自拍偷拍欧美亚洲 | 国产 一二三四五六 | 亚州国产 | 中文在线免费观看 | 国产欧美在线 | 亚洲综合站 | 黄色一级视频免费观看 | 成人高潮视频 | 粗了大了 整进去好爽视频 日本女优中文字幕 | 国产看真人毛片爱做a片 | 国产精品视频无码 | 97se在线视频 | 亚洲国产免费视频 | 在线免费看av | 色哟哟免费观看 | 国产精品海角社区 | 久久露脸国语精品国产91 | 国产第一毛片 | 久国产精品 | 欧洲激情网| 免费成人视屏 | 三级理伦 | 国产一级片毛片 | 成人av日韩 | 国产毛片久久久久 | 日产精品久久久久久久蜜臀 | 欧美精品国产一区二区 | 亚洲第五页 | 色狠狠一区 | 欧美色噜噜 | 国产视频第一区 | 国产天天操 |