FPGA實現圖像灰度轉換(1):RGB分量轉Gray


  Gray灰度圖像:即我們常說的黑白圖像,由黑到白的灰階為 0- 255(8bit)。

  本博客整理一下 RGB 分量實現 Gray 灰度效果的實驗,這個實驗非常的簡單,簡單到看到代碼就感覺非常無語......

一、RGB分量轉Gray灰度的原理

  RGB格式即一個像素由R、G、B三基色構成,例如 RGB565 格式的像素排列為R[4:0]、G[5:0]、B[4:0],RGB三個分量的數值不同,最后合成的像素顏色則不同。

  RGB分量轉Gray灰度即只挑取 R 或 G 或 B 的 1 個分量,剩下的 2 個分量丟棄,其位置由挑取的分量來替代。

 

二、MATLAB

  此次實驗選擇了一張 RGB 分量明顯的圖片,先從 MATLAB 軟件中查看效果如何。代碼如下所示:

clc;
clear all;
RGB = imread('flower.bmp'); %讀取圖像

R_gray = RGB(:,:,1);        %提取R分量后的灰度圖
G_gray = RGB(:,:,2);        %提取G分量后的灰度圖
B_gray = RGB(:,:,3);        %提取B分量后的灰度圖

subplot(2,2,1);imshow(RGB);   title('原圖');
subplot(2,2,2);imshow(R_gray);title('R分量灰度圖');
subplot(2,2,3);imshow(G_gray);title('G分量灰度圖');
subplot(2,2,4);imshow(B_gray);title('B分量灰度圖');

  運行效果如下所示:

  可以看出雖然都是灰度圖,但不同分量獲得的效果是不同的。

 

三、FPGA中的實現

1、模塊划分

  本實驗基於串口傳輸,在前面的博客中整理過。

  圖像處理的模塊添加在哪里好呢?一開始我是添加到串口模塊到 SDRAM 緩存模塊之間的,但是因為這次實驗是基於圖片的,加在這個位置后 SDRAM 里緩存的是一張處理之后的圖片,如果要進行效果切換則必須重新編譯下載工程,串口再重新發送圖片數據,非常的麻煩。經過思考,我決定不動SDRAM之前的模塊,讓SDRAM緩存原圖,再把圖像處理模塊添加在 TFT 控制器模塊之后,並且引入按鍵,通過按鍵切換顯示效果。這樣原先的TFT控制器模塊就相當於一個中轉站,圖像真正的傳輸到管腳是在圖像處理之后。因此我將 TFT 控制器模塊的名字由 TFT_driver 變為 RGB_driver,這樣后面的模塊的命名方便些,頂層的信號名也不用改太多。而圖像處理模塊則命名為 Image_Processor,專門進行各種圖像處理,最終的信號連接到 FPGA 的 TFT屏管腳。本工程的框架圖如下所示:

  Image_Processor 模塊內部的模塊如圖所示:

   這篇博客實際算是圖像處理的第一篇博客,之前的都是預備知識,所以展示的內容全一點,后續的圖像處理工程也都是基於此架構實現,不會再詳細說明。

2、RGB分量轉Gray灰度的 Verilog 實現

  過於簡單,所以直接貼代碼吧。

 1 //**************************************************************************
 2 // *** 名稱 : RGB_Gray.v
 3 // *** 作者 : xianyu_FPGA
 4 // *** 博客 : https://www.cnblogs.com/xianyufpga/
 5 // *** 日期 : 2020年3月
 6 // *** 描述 : RGB分量轉Gray灰度圖
 7 //**************************************************************************
 8 
 9 module RGB_Gray
10 //========================< 端口 >==========================================
11 (
12 input   wire    [15:0]      RGB_data                , //原始圖像數據
13 output  wire    [15:0]      red                     , //R分量灰度圖
14 output  wire    [15:0]      green                   , //G分量灰度圖
15 output  wire    [15:0]      blue                      //B分量灰度圖
16 );
17 //==========================================================================
18 //==                        代碼
19 //==========================================================================
20 assign red   = {RGB_data[15:11],RGB_data[15:11],1'b0,RGB_data[15:11]}; 
21 assign green = {RGB_data[10:6],RGB_data[10:5],RGB_data[10:6]};        
22 assign blue  = {RGB_data[4:0],RGB_data[4:0],1'b0,RGB_data[4:0]};      
23 
24 
25 
26 endmodule

  上面說過,這個圖像處理非常簡單,看到代碼就覺得非常無語......連時鍾和復位都沒有用到,如果不是為了實現按鍵切換的效果,其實可以直接在頂層assign一下就行了。但是本次實驗是后續一系列實驗的開篇之作,所以模塊什么的都盡可能划科學點,后面就省事了。

 

四、上板驗證

  原圖:

  R分量灰度圖:

  G分量灰度圖:

  B分量灰度圖:

  實驗效果和 MATLAB 中呈現的一樣,此次實驗成功。

  實驗可以通過按鍵模塊 key_select 切換顯示效果,切換順序為:原圖、R分量灰度圖、G分量灰度圖、B分量灰度圖。視頻演示如下:

 

參考資料:

    [1]小梅哥FPGA圖像處理教程

    [2]OpenS Lee:FPGA開源工作室(公眾號)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM