?(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程文件請關注知識星球:成工fpga,https://t.zsxq.com/DMeqH,關注即送200GB學習資料,鏈接已置頂!)
直方圖的均衡化上個系列也有詳細的講解,本課主要完成圖像直方圖均衡化的FPGA實現。
我們先來分析一下,實現圖像直方圖的均衡需要處理幾幀圖片?第一幀圖片完成直方圖統計,在第一幀和第二幀圖像之間完成直方圖數據的讀取,同時完成直方圖數據的均衡化和均衡化的存儲。第二幀圖像就可以根據存儲的均衡化數據完成整幅圖像的均衡化,所以要完成圖像的均衡化,需要兩幀圖像,視頻流水起來,就是后一幀圖像根據前一幀圖像完成圖像的直方圖均衡化。
那我們再來分析一下,如果要對均衡化的圖像再進行直方圖統計,需要處理幾幀圖像?上面我們分析第二幅圖像完成圖像的均衡化,在第二幅圖像均衡化的過程中,可以對均衡化的圖像數據進行直方圖的統計,那就是在第二幅圖像結束的時候完成圖像均衡化的直方圖統計,如果想把直方圖疊加到均衡化后的圖片上,那就要在第三幀圖像上完成。
在\src\hist文件夾下新建hist_equalization.sv文件,用來實現圖像的直方圖數據的均衡化,均衡化就是將小于等于當前標號的直方圖數據求和,其實第一個均衡化的數據就是第一個直方圖的數據,第二個均衡化的數據就是第一個和第二個直方圖數據的和,第三個均衡化的數據就是前三個直方圖數據的和......最后一個均衡化的數據所有直方圖數據的和。如下,52-58行求和的運算。
每次求和完成一個直方圖均衡化數據的計算,然后直接對均衡化后的數據進行歸一化處理,歸一化處理是將數據映射到0-255區間。歸一化因子是699,計算公式是256*1024*1024/(H_ACTIVE*V_ACTIVE),數據放大了2^20倍,所以最終的結果將低20位直接舍棄,也就是結果右移20位。歸一化后的均衡化數據存放到數組中,下一幀數據的每個像素值作為數組的地址讀出其中的值,完成下一幀圖像的均衡化,這個超過其實和gamma矯正完全一樣。
在top文件中例化了rgb2ycbcr,hist_statistics,hist_equalization,ycbcr2rgb,hist_norm,hist_mem,plot_hist等模塊,如下所示。先將RGB圖像轉成灰度圖像,對灰度圖像進行圖像的直方圖統計和均衡,再將均衡后的灰度圖像轉換回RGB圖像,同是對均衡后的灰度圖像進行直方圖統計。
在tb_image_sim文件中的第二個initial塊中,將圖像測試平臺和FPGA硬件仿真的結果保存并比對,需要注意一點,要完成兩幀圖像的處理,通過wait((frame_cnt == FRAME_NUM) & frame_done)來實現,這兒FRAME_NUM是2。
雙擊sim文件夾下的top_tb.bat文件,完成系統的自動化仿真。
可以看到在modelsim的Transcript有如下的打印信息,圖像測試平臺和FPGA硬件仿真的結果一致。
打開img文件夾,也可以看到圖像測試平臺和FPGA硬件仿真的結果是一致的(no_seq*是圖像測試平臺處理后的圖片,seq*是FPGA硬件仿真處理后的結果)。
同時也可以看一下圖像釋放圖均衡前后的效果圖。