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開源工作室(公眾號)