Matlab实现均值滤波与FPGA进行对比,并采用modelsim波形仿真
文章目錄
- 一、實驗目標
- 二、實驗中遇到的問題
- 1、如何實現均值濾波
- 2、modelsim仿真的時候涉及到IP核不存在怎么辦?
- 三、具體實現
- 3.1 均值濾波的實現
- 3.1.1 調用shift_ram ip核:
- 3.1.2 均值濾波的流水并行處理
- 3.2 整體模塊設計
- 3.2.1 圖像生成模塊
- 3.2.2 Ycbcr灰度化
- 3.2.3 3*3窗口生成
- 3.2.4 均值濾波模塊
- 3.3 波形仿真驗證
- matlab實現均值濾波
本文的方法和 聯合仿真實現Ycbcr的方法相同。不再重復敘述。
一、實驗目標
在Ycbcr灰度化基礎上進行均值濾波。
二、實驗中遇到的問題
1、如何實現均值濾波
2、modelsim仿真的時候涉及到IP核不存在怎么辦?
如下圖,我們調用了shift_ram ip核,不添加庫文件的話,獨立仿真時報錯
解決方法:
將器件庫添加上即可。
選擇simulation —— start simulation——Libraries——Add,添加庫文件
庫文件所在位置:modelsim安裝位置,modelsim-ase——aletra——Verilog——altera_mf || cyclonev(根據所用開發板型號選擇)
三、具體實現
3.1 均值濾波的實現
1、這部分包含兩個模塊:3*3窗口生成模塊以及均值濾波算法實現模塊。(參考其他博文,理論部分不在講解)
2、33窗口生成模塊:filter_33;——調用了shift_ram ip核。
3、均值濾波模塊 :mean_filter;——采用三級流水線的方式進行處理。流水線技術是FPGA常用的思想。
3.1.1 調用shift_ram ip核:
3.1.2 均值濾波的流水并行處理
如下我們可得到均值濾波的公式:mean_data = P11 + P12 + P13 + P21 + P23 + P31 +P32 + P33 / 8;將其拆成三級流水線并行處理的形式:
第一級流水線并行處理:
P1 = P11 + P12 + P13 ;P2 = P21 + P23 ;P3 = P31 +P32 + P33;
.
第二級流水線處理:
P = P1 + P2 + P3;
.
第三級流水線處理:
P >> 3 或者取高位
3.2 整體模塊設計
圖像生成模塊(VGA模塊+數據的獲取);
Ycbcr灰度化模塊;
3*3窗口生成模塊;
均值濾波模塊:
3.2.1 圖像生成模塊
module img_gen ( //系統全局信號 input wire clk , input wire rst_n , //原圖輸出 ---------------------------------------- output wire img_hsync , //原圖行同步信號 output wire img_vsync , //場同步信號 output reg [23:0] img_data , //原圖像數據信號 output reg img_de //數據有效指示信號 ); endmodule該模塊數據的獲取如下:
當quartus查看RTL圖的時候,由于不可綜合,將其引去即可。
3.2.2 Ycbcr灰度化
該模塊不變。
module RGB_Gray //========================< 端口 >========================================== ( input wire clk , //時鐘 input wire rst_n , //復位 //原圖 ---------------------------------------------- input wire RGB_hsync, input wire RGB_vsync, input wire [23:0] RGB_data, input wire RGB_de , //灰度轉換圖 ---------------------------------------------- //這里的行場有效信號和數據信號根據消耗時鐘打三拍,作為下一模塊輸入 output wire gray_hsync, output wire gray_vsync, output wire gray_de, output wire [7:0] gray_data);3.2.3 3*3窗口生成
module filter_3x3(input clk,input rst_n, //灰度化打拍后的行場有效以及數據有效信號input gray_hsync, input gray_vsync,input gray_de ,input [7:0] iData, //根據3*3窗口生成模塊實際消耗時鐘進行延遲output filter_hsync, output filter_vsync , output filter_de, //生成的3*3窗口數據 output reg [7:0] oData_11, oData_12, oData_13,output reg [7:0] oData_21, oData_22, oData_23,output reg [7:0] oData_31, oData_32, oData_33 );3.2.4 均值濾波模塊
module mean_filter(input clk,input rst_n,//來自3*3窗口生成模塊 input wire filter_hsync , input wire filter_vsync ,input wire filter_de , //生成的3*3窗口數據input [7:0] filter_11,filter_12,filter_13, input [7:0] filter_21,filter_22,filter_23,input [7:0] filter_31,filter_32,filter_33, //均值處理后行場、數據有效信號根據消耗時鐘打拍 output mean_hsync , output mean_vsync , output mean_de ,output [7:0] mean_data // 最終均值,3x3模板總和/8);3.3 波形仿真驗證
1、tb測試文件不變。
仍然處理后的640*480個數據寫入到txt文檔中。
2、波形分析
以第一行數據為例
img_de : 原圖數據有效信號
img_data:原圖數據
gray_de:灰度化數據有效信號
gray_data:灰度化的圖像數據 = iData
filter_de : 33窗口生成數據有效信號
oData11 - 33 :33窗口的數據
mean_de : 均值濾波數據有效信號
mean_data : 3*3窗口數據的均值
VGA_de : VGA有效數據信號 = mean_de
第一個均值:164 / 8 = 20
第二個均值:(164 + 1580) / 8 = 40
第三個均值:(164 + 158 + 153 ) / 8= 59 ……
matlab實現均值濾波
matlab均值濾波:
x=imread('pre_img.jpg');%需要過濾的圖像 n=3; %模板大小 [height, width]=size(x); %獲取圖像的尺寸(n小于圖片的寬高) gdata = rgb2gray(x); imshow(gdata),title('原圖灰度化'); for i=1:height-n+1 for j=1:width-n+1 c=x(i:i+(n-1),j:j+(n-1)); %在x1中從頭取模板大小的塊賦給c e=c(1,:); %e中存放是c矩陣的第一行 for u=2:n %將c中的其他行元素取出來接在e后使e為一個行矩陣 e=[e,c(u,:)]; end s=sum(e); %取一行的和 x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %將模板各元素的均值賦給模板中心位置的元素 end end d=uint8(x); %未被賦值的元素取原值 C=rgb2gray(x); %灰度處理,灰度處理后的圖像是二維矩陣 A=fspecial('average',[n,n]); %matlab中自帶值濾波函數 b=imfilter(C,A); figure; imshow(b),title('均值濾波'); %顯示過濾后的灰度圖片 imwrite(b,'matlab均值濾波.jpg');結果:
由于灰度化處理以及均值濾波求解的時候均存在精度問題,可能導致與matllab處理后的像素值存在微小差異。不是重點,觀察均值濾波的效果,可看到二者均值濾波處理后的圖像均變模糊。
更簡化的均值濾波工程,讀入圖像的方式不同,著重看均值濾波算法實現部分即可。
總結
以上是生活随笔為你收集整理的Matlab实现均值滤波与FPGA进行对比,并采用modelsim波形仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构_郝斌老师自学大纲
- 下一篇: SPICE 协议 USB 重定向