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