默認迭代次數為1,只進行一次腐蝕、膨脹
一、圖像腐蝕
1.相關定義?
2.圖像腐蝕效果圖
?
3.fpga實現?
彩色圖像灰度化,灰度圖像二值化,圖像緩存生成濾波模塊(3*3),圖像腐蝕算法
`timescale 1ns / 1ps
//
// Description: 圖像腐蝕 (前景色是黑色(0),背景色是白色(1) 腐蝕黑色)
//
module image_erode(input wire clk ,input wire reset ,input wire [10:0] img_width ,input wire [9:0] img_height ,input wire valid_i ,input wire [23:0] last_line_data ,input wire [23:0] cur_line_data ,input wire [23:0] next_line_data ,output reg valid_o ,output reg [23:0] img_data_o
);//常量聲明parameter N = 3; //窗口大小//結構系數模版為{1,1,1,// 1,1,1,// 1,1,1}//變量聲明reg valid_d1;reg [23:0] last_line_data_d1, last_line_data_d2;reg [23:0] cur_line_data_d1 , cur_line_data_d2 ;reg [23:0] next_line_data_d1, next_line_data_d2;//中心點位置,為cur_line_data_d1always@(posedge clk or posedge reset) beginif(reset) beginvalid_d1 <= 0;{last_line_data_d1, last_line_data_d2} <= 0;{cur_line_data_d1 , cur_line_data_d2 } <= 0;{next_line_data_d1, next_line_data_d2} <= 0;end else beginvalid_d1 <= valid_i;last_line_data_d1 <= last_line_data;last_line_data_d2 <= last_line_data_d1;cur_line_data_d1 <= cur_line_data;cur_line_data_d2 <= cur_line_data_d1;next_line_data_d1 <= next_line_data;next_line_data_d2 <= next_line_data_d1;endend//模板窗口范圍內判斷,前景色是黑色,背景色是白色,腐蝕處理就是前景色黑色減少//簡單理解也就是,3*3窗口中所有像素值都是0時,才能將當前像素值為0輸出always@(posedge clk or posedge reset) beginif(reset) beginvalid_o <= 0;img_data_o <= 0;end else if(valid_d1) beginif({last_line_data_d2, last_line_data_d1, last_line_data,cur_line_data_d2 , cur_line_data_d1 , cur_line_data ,next_line_data_d2, next_line_data_d1, next_line_data} == {27{8'd0}}) beginimg_data_o <= cur_line_data_d1;end else beginimg_data_o <= {3{8'd255}}; endvalid_o <= 1'b1;end else beginvalid_o <= 0;img_data_o <= 0;endendendmodule
明顯可以看書漢字部分,經過腐蝕運算之后,白色字體變寬了(要是清晰顯示文字,應該腐蝕白色,效果可能更好一點)?
二、圖像膨脹
1.相關定義
?2.圖像膨脹與圖像腐蝕的聯系
?3.FPGA實現
`timescale 1ns / 1ps
//
// Description: 圖像膨脹 (前景色是黑色,背景色是白色 只要覆蓋區域有前景色則膨脹黑色)
//
module image_dilate(input wire clk ,input wire reset ,input wire [10:0] img_width ,input wire [9:0] img_height ,input wire valid_i ,input wire [23:0] last_line_data ,input wire [23:0] cur_line_data ,input wire [23:0] next_line_data , output reg valid_o ,output reg [23:0] img_data_o
);//常量聲明parameter N = 3; //窗口大小//結構系數模版為{1,1,1,1,1,1,1,1,1}//變量聲明reg valid_d1;reg [23:0] last_line_data_d1, last_line_data_d2;reg [23:0] cur_line_data_d1 , cur_line_data_d2 ;reg [23:0] next_line_data_d1, next_line_data_d2;//中心點位置,為cur_line_data_d1always@(posedge clk or posedge reset) beginif(reset) beginvalid_d1 <= 0;{last_line_data_d1, last_line_data_d2} <= 0;{cur_line_data_d1 , cur_line_data_d2 } <= 0;{next_line_data_d1, next_line_data_d2} <= 0;end else beginvalid_d1 <= valid_i;last_line_data_d1 <= last_line_data;last_line_data_d2 <= last_line_data_d1;cur_line_data_d1 <= cur_line_data;cur_line_data_d2 <= cur_line_data_d1;next_line_data_d1 <= next_line_data;next_line_data_d2 <= next_line_data;endend//模板窗口范圍內判斷,前景色是黑色,背景色是白色,膨脹處理就是前景色黑色擴張//簡單理解也就是,3*3窗口中所有像素值都是255(白)時,才能將當前像素值為255輸出always@(posedge clk or posedge reset) beginif(reset) beginvalid_o <= 0;img_data_o <= 0;end else if(valid_d1) beginif({last_line_data_d2, last_line_data_d1, last_line_data,cur_line_data_d2 , cur_line_data_d1 , cur_line_data ,next_line_data_d2, next_line_data_d1, next_line_data} == {27{8'd255}}) beginimg_data_o <= cur_line_data_d1;end else beginimg_data_o <= 0; endvalid_o <= 1'b1;end else beginvalid_o <= 0;img_data_o <= 0;endendendmodule
?三、圖像處理的開運算,閉運算和梯度運算
1.相關定義?
2.fpga實現?
開運算:
閉運算 :
梯度運算:
module image_process_top(input wire clk,input wire reset,input wire [10:0] img_width,input wire [9:0] img_height,input wire valid_i,input wire [23:0] img_data_i,output wire valid_o,output wire [23:0] img_data_o);//參數定義wire rgb2gray_valid;wire [23:0] rgb2gray_data;wire binary_valid;wire [23:0] binary_data;wire line_valid;wire [23:0] last_line_data, cur_line_data, next_line_data;wire erode_valid;wire [23:0] erode_data;wire dilate_valid;wire [23:0] dilate_data;wire line1_valid;wire [23:0] last_line1_data, cur_line1_data, next_line1_data;//灰度化處理image_rgb2gray u_image_rgb2gray(.clk ( clk ),.reset ( reset ),.valid_i ( valid_i ),.img_data_i ( img_data_i ),.valid_o ( rgb2gray_valid ),.img_data_o ( rgb2gray_data ));//二值化處理image_binary u_image_binary(.clk ( clk ),.reset ( reset ),.valid_i ( rgb2gray_valid ),.img_data_i ( rgb2gray_data ),.valid_o ( binary_valid ),.img_data_o ( binary_data ));//開運算
/*//3行緩存image_line_buffer u_image_line_buffer(.clk ( clk ),.reset ( reset ),.img_width ( img_width ),.img_height ( img_height ),.valid_i ( binary_valid ),.img_data_i ( binary_data ),.valid_o ( line_valid ),.last_line_data ( last_line_data ),.cur_line_data ( cur_line_data ),.next_line_data ( next_line_data ));//圖像腐蝕image_erode u_image_erode(.clk ( clk ),.reset ( reset ),.img_width ( img_width ),.img_height ( img_height ),.valid_i ( line_valid ),.last_line_data ( last_line_data ),.cur_line_data ( cur_line_data ),.next_line_data ( next_line_data ),.valid_o ( erode_valid ),.img_data_o ( erode_data ));//3行緩存image_line_buffer u_image_line_buffer1(.clk ( clk ),.reset ( reset ),.img_width ( img_width ),.img_height ( img_height ),.valid_i ( erode_valid ),.img_data_i ( erode_data ),.valid_o ( line1_valid ),.last_line_data ( last_line1_data ),.cur_line_data ( cur_line1_data ),.next_line_data ( next_line1_data ));//圖像膨脹image_dilate u_image_dilate(.clk ( clk ),.reset ( reset ),.img_width ( img_width ),.img_height ( img_height ),.valid_i ( line1_valid ),.last_line_data ( last_line1_data ),.cur_line_data ( cur_line1_data ),.next_line_data ( next_line1_data ),.valid_o ( valid_o ),.img_data_o ( img_data_o ));
*///閉運算
/*//3行緩存image_line_buffer u_image_line_buffer(.clk ( clk ),.reset ( reset ),.img_width ( img_width ),.img_height ( img_height ),.valid_i ( binary_valid ),.img_data_i ( binary_data ),.valid_o ( line_valid ),.last_line_data ( last_line_data ),.cur_line_data ( cur_line_data ),.next_line_data ( next_line_data ));//圖像膨脹image_dilate u_image_dilate(.clk ( clk ),.reset ( reset ),.img_width ( img_width ),.img_height ( img_height ),.valid_i ( line_valid ),.last_line_data ( last_line_data ),.cur_line_data ( cur_line_data ),.next_line_data ( next_line_data ),.valid_o ( dilate_valid ),.img_data_o ( dilate_data ));//3行緩存image_line_buffer u_image_line_buffer1(.clk ( clk ),.reset ( reset ),.img_width ( img_width ),.img_height ( img_height ),.valid_i ( dilate_valid ),.img_data_i ( dilate_data ),.valid_o ( line1_valid ),.last_line_data ( last_line1_data ),.cur_line_data ( cur_line1_data ),.next_line_data ( next_line1_data ));//圖像腐蝕image_erode u_image_erode(.clk ( clk ),.reset ( reset ),.img_width ( img_width ),.img_height ( img_height ),.valid_i ( line1_valid ),.last_line_data ( last_line1_data ),.cur_line_data ( cur_line1_data ),.next_line_data ( next_line1_data ),.valid_o ( valid_o ),.img_data_o ( img_data_o ));
*///梯度運算//3行緩存image_line_buffer u_image_line_buffer(.clk ( clk ),.reset ( reset ),.img_width ( img_width ),.img_height ( img_height ),.valid_i ( binary_valid ),.img_data_i ( binary_data ),.valid_o ( line_valid ),.last_line_data ( last_line_data ),.cur_line_data ( cur_line_data ),.next_line_data ( next_line_data ));//圖像膨脹image_dilate u_image_dilate(.clk ( clk ),.reset ( reset ),.img_width ( img_width ),.img_height ( img_height ),.valid_i ( line_valid ),.last_line_data ( last_line_data ),.cur_line_data ( cur_line_data ),.next_line_data ( next_line_data ),.valid_o ( dilate_valid ),.img_data_o ( dilate_data ));//圖像腐蝕image_erode u_image_erode(.clk ( clk ),.reset ( reset ),.img_width ( img_width ),.img_height ( img_height ),.valid_i ( line_valid ),.last_line_data ( last_line_data ),.cur_line_data ( cur_line_data ),.next_line_data ( next_line_data ),.valid_o ( erode_valid ),.img_data_o ( erode_data ));assign valid_o = dilate_valid;assign img_data_o = (dilate_data == 0)&&(erode_data == {3{8'd255}}) ? 0 : {3{8'd255}};endmodule