1. 程式人生 > >基於FPGA的RGB565_YCbCr_Gray算法實現

基於FPGA的RGB565_YCbCr_Gray算法實現

代碼 pro 三元組 方便 新的 算法實現 成功 配置 微博

前面我們講了基於FPGA用VGA顯示一副靜態圖片,那麽接下來我們就接著前面的工程來實現我們圖像處理的基礎算法裏最簡單的一個那就是彩色圖像轉灰度的實現。

將彩色圖像轉化為灰度的方法有兩種,一個是令RGB三個分量的數值相等,輸出後便可以得到灰度圖像,另一種是轉化為YCbCr格式,將Y分量提取出來,YCbCr格式中的Y分量表示的是圖像的亮度和濃度所以只輸出Y分量,得到的圖像就是灰度圖像了。我在這裏選擇第二種方法實現。

YCBCr是通過有序的三元組來表示的,三元由Y(Luminance)、Cb(Chrominance-Blue)和Cr(Chrominance-Red)組成,其中Y表示顏色的明亮度和濃度,而Cb和Cr則分別表示顏色的藍色濃度偏移量和紅色濃度偏移量。人的肉眼對由YCbCr色彩空間編碼的視頻中的Y分量更敏感,而Cb和Cr的微小變化不會引起視覺上的不同,根據該原理,通過對Cb和Cr進行子采樣來減小圖像的數據量,使得圖像對存儲需求和傳輸帶寬的要求大大降低,從而達到在完成圖像壓縮的同時也保證了視覺上幾乎沒有損失的效果,進而使得圖像的傳輸速度更快,存儲更加方便。我們要的到灰度圖像,首先要將采集到的彩色圖像轉化為YCbCr。

我們配置攝像頭采集到的數據是RGB565的格式,官方給出的轉化公式是RGB888->YCbCr,所以先需要將RGB565轉化為RGB888,轉化方法如下:

24bit RGB888 -> 16bit RGB565 的轉換(只取高位)

24ibt RGB888 {R7 R6 R5 R4 R3 R2 R1 R0} {G7 G6 G5 G4 G3 G2 G1 G0} {B7 B6 B5 B4 B3 B2 B1 B0}

16bit RGB656 {R7 R6 R5 R4 R3} {G7 G6 G5 G4 G3 G2} {B7 B6 B5 B4 B3}

同樣也可以恢復回去。

16bit RGB565 -> 24bit RGB888

的轉換(高位補低位)

16bit RGB656 {R4 R3 R2 R1 R0} {G5 G4 G3 G2 G1 G0} {B4 B3 B2 B1 B0}

24ibt RGB888 {R4 R3 R2 R1 R0 R2 R1 R0} {G5 G4 G3 G2 G1 G0 G1 G0} {B4 B3 B2 B1 B0 B2 B1 B0}

技術分享

采用高位補低位的方法直接轉化即可。

這是官方給的RGB888 to YCbCr的算法公式,我們可以直接把算法移植到FPGA上,但是我們都知道FPGA無法進行浮點運算,所以我們采取將整個式子右端先都擴大256倍,然後再右移8位,這樣就得到了FPGA擅長的乘法運算和加法運算了。

技術分享

這個計算式子看起來是十分簡單的,但是要是直接用Verilog直接寫出來,那麽只能說,這個人的代碼寫的一塌糊塗,所以這裏就引出FPGA中流水線的設計思想。

在這裏我們選擇加3級流水線,就第一個Y分量而言,先計算括號中得乘法運算,消耗一個時鐘,然後將括號中的數據求和,消耗一個時鐘,這裏為了計算方便,將128也擴大256倍,放到括號中,最終結果除以256就行了也就是右移8位,在FPGA中我們只需要舍棄低8位取高8位就行。具體代碼如下

將RGB565—>YCbCr成功後,提取出Y的值輸出,就可以得到灰度色彩的圖像了。

將采集到的RGB565的像素數據,輸入到算法處理模塊進行操作,由RGB565——>YCbCr——Gray官方給出的公式來算,先將RGB565拆分開R G B三個分量,使用如上公式計算的到Y Cb Cr是三個分量。

技術分享

RGB轉YCbCr算法的仿真過程,從圖中可以看出,加了流水線後的運算過程,每一級運算相差一個時鐘,然而每一級都在進行新的運算,我們加了3級流水線,這樣運算速度可以提升3倍。

技術分享

最後將Y分量的數據輸出,進行位拼接,16位的RGB565像素R、G、B分量分別對應的取Y分量的高位,最後的輸出顯示出來就是灰度圖像了。

技術分享

技術分享

最後將原圖與經過轉灰度算法之後的圖片,進行比較,我們的lena美女是不是在灰白顯示下也很好看呢!

如果你想獲得本文的所有課件和工程代碼,請關註本人的個人微信訂閱號:開源FPGANingHeChuan或掃描下方二維碼關註訂閱號,在後臺回復圖像處理,即可獲得本文的所有課件、資料、和工程源碼哦!

技術分享

轉載請註明出處:NingHeChuan(寧河川)

個人微信訂閱號:開源FPGANingHeChuan

如果你想及時收到個人撰寫的博文推送,可以掃描左邊二維碼(或者長按識別二維碼)關註個人微信訂閱號

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.cnblogs.com/ninghechuan/p/7403725.html

基於FPGA的RGB565_YCbCr_Gray算法實現