日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Matlab实现均值滤波与FPGA进行对比,并采用modelsim波形仿真

發布時間:2023/12/31 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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圖的時候,由于不可綜合,將其引去即可。

initial begin$readmemh("pre_img.txt", ram); end

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文檔中。

//打開post_img.txt文件 //--------------------------------------------------- integer post_img_txt;initial beginpost_img_txt = $fopen("post_img.txt"); end//像素寫入到txt中 //--------------------------------------------------- reg [20:0] pixel_cnt; //640*480 = 307200 ,對這些像素逐個寫入always @(posedge clk) beginif(!rst_n) beginpixel_cnt <= 0;endelse if(VGA_de) beginpixel_cnt = pixel_cnt + 1;$fdisplay(post_img_txt,"%h",VGA_data);if(pixel_cnt == IMG_H*IMG_W)$stop;end end

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波形仿真的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。