1. 程式人生 > >Verilog實現基本的影象濾波處理模擬

Verilog實現基本的影象濾波處理模擬

1,用matlab程式碼,準備好把圖片轉化成Vivado Simulator識別的格式,即每行一個數據:

img = imread('E:\matlab\Images\2016-09-05-211710.jpg');
if size(img,3)==3
    img = rgb2gray(img);
end
height = size(img, 1);
width = size(img, 2);
s = fopen('image2mem.txt','wb'); %opens the output file
cnt = 0;
for r=1:height
    for c=1:width
        cnt = cnt + 1
; grey=img(r,c); greyb = dec2bin(grey,8); Outbyte =greyb(1:8); if (Outbyte(1:4) == '0000')fprintf(s,'0%X',bin2dec(Outbyte)); else fprintf(s,'%X',bin2dec(Outbyte)); end if (mod(cnt,1) == 0)fprintf(s,'\r\n'); end end end figure,imshow(img); fclose(s);

2,EdgeSobel的Verilog原始碼:

`timescale 1ns / 1ps

module EdgeSobel
    (
    input clk,
    input [7:0] inData,
    input [11:0]x,
    input [11:0]y,
    output [7:0] outData
    );    
    parameter pixel_depth=8;
    parameter frame_width=640;
    parameter block_width=3;
    parameter block_height=3;

    parameter shiftRegSize=pixel_depth*((block_height-1)*frame_width+block_width);

    reg[shiftRegSize-1:0] shiftReg;
    wire [block_width*block_height*pixel_depth-1:0] Window;  

    initial begin shiftReg=10264'b0;end

    
[email protected]
(posedge clk)if((x<640)&&(y<480))shiftReg<={shiftReg,inData}; genvar i,j; generate for(i = 0; i < block_height; i = i + 1) begin : array for(j = 0; j < block_width; j = j + 1) begin : vector assign Window[pixel_depth*(i * block_width + j)+:pixel_depth] =shiftReg[pixel_depth*(i*frame_width+j)+:pixel_depth]; end end endgenerate wire [7:0] average; assign average = (Window[7:0]+Window[15:8]+Window[23:16]+ //Window[31:24]+Window[39:32]+Window[47:40]+ Window[31:24]+Window[39:32]+Window[47:40]+ Window[55:48]+Window[63:56]+Window[71:64])/9 ; wire signed [pixel_depth+1:0] Gx; wire signed [pixel_depth+1:0] Gy; wire [pixel_depth+1:0] Gxabs; wire [pixel_depth+1:0] Gyabs; wire [pixel_depth+1:0] G; assign Gx = shiftReg[pixel_depth*(0*frame_width+2)+:pixel_depth] +2*shiftReg[pixel_depth*(1*frame_width+2)+:pixel_depth] + shiftReg[pixel_depth*(2*frame_width+2)+:pixel_depth] - shiftReg[pixel_depth*(0*frame_width+0)+:pixel_depth] -2*shiftReg[pixel_depth*(1*frame_width+0)+:pixel_depth] - shiftReg[pixel_depth*(2*frame_width+0)+:pixel_depth]; assign Gy = shiftReg[pixel_depth*(2*frame_width+0)+:pixel_depth] +2*shiftReg[pixel_depth*(2*frame_width+1)+:pixel_depth] + shiftReg[pixel_depth*(2*frame_width+2)+:pixel_depth] - shiftReg[pixel_depth*(0*frame_width+0)+:pixel_depth] -2*shiftReg[pixel_depth*(0*frame_width+1)+:pixel_depth] - shiftReg[pixel_depth*(0*frame_width+2)+:pixel_depth]; assign Gxabs = (Gx>0)?Gx:(-Gx); assign Gyabs = (Gy>0)?Gy:(-Gy); assign G = Gxabs+Gyabs; //assign outData = average; //平滑 assign outData = G[9:2]; //邊緣檢測 endmodule

3,模擬檔案:tb_EdgeSobel.v

`timescale 1ns / 1ps

module tb_edgesobel;

    reg clk;
    reg [7:0]  inData;
    reg [19:0] cnt;
    reg [9:0] row;
    wire [7:0] outData;
    reg [7:0] image [307199:0];
    integer file_id;
    reg [4:0] frame_cnt;


    initial
    begin
        $readmemh("E:/matlab/Vivado/image2mem.txt", image);
        file_id = $fopen("E:/matlab/Vivado/mem2image.txt","w");
        clk = 0;
        cnt = 0;
        row = 0;
        frame_cnt = 0;
    end

    EdgeSobel u_2
    (
    .clk(clk),
    .x(1),
    .y(1),
    .inData(inData),
    .outData(outData)
    );

    always #1 clk = ~clk;

    [email protected](posedge clk)
    begin
        if(cnt == 307200)    
        begin
            cnt = 0;
            row = 0;
            frame_cnt = frame_cnt + 1;
        end    
        else 
        inData = image[cnt];
        cnt = cnt+1;
        if(frame_cnt==1)
            begin
                $fwrite(file_id, "%d ", outData);
                if(((cnt % 640)==0) &&(cnt>0)) 
                begin 
                    $fwrite(file_id,"\r\n");
                    row = row + 1;
                end;
            end
    end
endmodule

執行完模擬後記得關閉模擬程式,不然輸出的txt檔案不完整。

4,把輸出的txt檔案轉化成圖片Matlab程式:

A=importdata('E:\matlab\Vivado\mem2image.txt');
A=A./255;
imshow(A);

注意這裡的A是double型別的,直接進行imshow會全白,要轉化到0-1:A=A./255;
或者把double型別轉化為整形。

相關推薦

Verilog實現基本影象濾波處理模擬

1,用matlab程式碼,準備好把圖片轉化成Vivado Simulator識別的格式,即每行一個數據: img = imread('E:\matlab\Images\2016-09-05-211710.jpg'); if size(img,3)==3

影象濾波處理:頻域濾波器實現

課後作業,實現“理想、巴特沃斯、高斯”高通低通濾波器。 程式碼基於Matlab實現。完整程式碼及處理結果見:GitHub 步驟 載入影象 中心化影象 傅立葉變換 與濾波器做運算(空域的卷積運算對應頻域的乘法運算) 傅立葉反變換 裁剪影象

verilog實現中值濾波

轉自:https://www.cnblogs.com/happyamyhope/ 前言: 首先謝謝原博主的文章,對我的幫助很大,提供了一個完整的思路,極大方便了我將演算法移植到FPGA上。 實現步驟: 1.查看了中值濾波實現相關的網站和paper; 2.按照某篇paper的設計思

影象處理】FPGA verilog實現16位RGB的影象的灰度轉換

專案:FPGA verilog實現16位RGB的影象的轉換為8位寬的灰度圖。 專案需要的模組:呼叫一個RAM,16*22500,灰度處理模組和VGA800X600模組。          本次用到的FPGA是spartan6  X16。因為資源少,所以先嚐試的做點簡單的影

python數字影象處理(13):基本形態學濾波

對影象進行形態學變換。變換物件一般為灰度圖或二值圖,功能函式放在morphology子模組內。 1、膨脹(dilation) 原理:一般對二值影象進行操作。找到畫素值為1的點,將它的鄰近畫素點都設定成這個值。1值表示白,0值表示黑,因此膨脹操作可以擴大白色值範圍,壓縮黑色值範圍。一般用來擴充邊緣或填充

VC++高斯濾波\中值濾波實現影象模糊處理

一、演算法 高斯模糊演算法 詳見:高斯模糊,基本思想就是利用高斯函式,將一個座標點的所有鄰域的加權平均值設定為這些點的顏色值。 中值濾波演算法就更簡單了:將一個座標點的所有鄰域的平均值設定為這些點的畫素值。 二、演算法的程式碼實現 高斯函式: 使用巨集定義來替換: #de

matlab的基本用法---關於對影象處理

matlab的基本用法一關於對影象的處理 原文 1. 讀取影象:用imread函式讀取影象檔案,檔案格式可以是TIFF、JPEG、GIF、BMP、PNG等 %讀取指定路徑下的圖片,並儲存成一個影象矩陣 imageMatrix= imread('C:\Users\AA\

影象處理 && C實現

之前用到的一些預處理整理,主要是影象增強和濾波演算法。 程式碼地址:https://github.com/WangLCG/Image_Process/tree/master/Image_enhance 1、直方圖均衡化 調整影象的灰度分佈使其能在0-255範圍內分佈更均衡,可用於提

用keras實現基本影象分類任務

資料集介紹 fashion mnist資料集是mnist的進階版本,有10種對應的結果 訓練集有60000個,每一個都是28*28的影象,每一個對應一個標籤(0-9)表示 測試集有10000個 程式碼 import tensorflow as tf import keras import numpy

opencv3.0 影象濾波方式程式碼實現

#include #include<opencv/cv.h> #include<opencv2/opencv.hpp> using namespace std; int main() { string imName = “lena.jpg”; cv::Mat

matlab影象處理中值濾波y與雙邊濾波

中值濾波 前面所說的高斯平滑和均值濾波也是預處理的一種,不過他們用犧牲影象細節為代價來換取平滑影象,他們對處理小的噪聲點比較好,但是處理較大的噪聲點比較無力。 平滑線性濾波器的工作原理可以比喻為用水沖洗桌面上的汙點,沖洗的結果是汙點並沒有消失,只是被淡化,如果汙

C#基礎(1) 異常實現基本錯誤處理

本文作為C#基礎知識的查漏補缺使用,所以並不全面. 參考書籍<<C#本質論>>,<<C#高階程式設計>> static void Main(string[] args) { WriteLine("Hello World!

C++ Opencv——影象處理——濾波

#include <opencv2/opencv.hpp> #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\i

OpenCV4Android開發實錄(5):影象邊緣處理與非線性濾波(中值、雙邊)

在OpenCV4Android開發實錄(4):影象去噪與線性濾波(均值、方框、高斯)文章中,我們較為詳細地介紹了OpenCV中幾種常用的線性濾波方法原理和相關API的使用,本文將在此基礎上繼續講解OpenCV中中值和雙邊兩種非線性濾波,以及在影象濾波過

verilog實現16位五級流水線的CPU帶Hazard衝突處理

https://www.cnblogs.com/wsine/p/4661147.html 該文是基於博主之前一篇部落格http://www.cnblogs.com/wsine/p/4292869.html所增加的Hazard處理,相同的內容就不重複寫了,可點選連結檢視之前的部落格。 CPU設

OpenCV中對模糊操作的總結 影象處理:基礎(模板、卷積運算) 影象處理-模板、卷積的整理 推文:影象濾波函式imfilter函式的應用及其擴充套件

原帖地址 三種模糊操作 均值模糊 中值模糊 自定義模糊(可以實現上面兩種模糊方式)   這個演算法類似有:均值,中值,就是取周圍所有畫素的均值、中值來設定這個畫素的大小。   (關於邊界問題:有幾種填充方法:補零、邊界複製、塊複製、映象複

VC++實現Contourlet影象處理

Contourlet的作者只提供了Matlab原始碼,效率較低,法國的一位大牛,IRISA University的Vivien Chappelier,編寫了Contourlet的C程式碼。本文簡單介紹利用該原始碼實現基於Contourlet的影象處理,系統平臺為WindowsXP + VC++6.0。因為Co

matlab實現影象濾波——高斯濾波

要求 生成一個(2N+1)×(2N+1)大小的高斯模板H(標準為sigma),然後用此模板對影象進行濾波。不允許使用 fspecial 來產生高斯模板,不允許使用 imfilter、conv2 等函式。 原理及演算法 理解:高斯濾波就是對整幅影象進行加權平均的過程,每一個畫素點的值,都由其本身和鄰域

影象恢復及濾波處理

function R = imnoise2(type, M, N, a, b) %IMNOISE2 Generates an array of random numbers with specified PDF. % R = IMNOISE2(TYPE, M, N, A, B) generates an

影象處理影象濾波去噪聲——均值濾波、中值濾波、對稱均值濾波 低通濾波 高通濾波(opencv)

①觀察灰度分佈來描述一幅影象成為空間域,觀察影象變化的頻率被成為頻域。  ②頻域分析:低頻對應區域的影象強度變化緩慢,高頻對應的變化快。低通濾波器去除了影象的高頻部分,高通濾波器去除了影象的低頻部分。 (1)低通濾波  ①栗子: #include <iostream> #include &l