国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ZYNQ圖像處理(6)——均值濾波和中值濾波

這篇具有很好參考價(jià)值的文章主要介紹了ZYNQ圖像處理(6)——均值濾波和中值濾波。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、均值和中值濾波基本原理

首先要做的是最簡(jiǎn)單的均值濾波算法。均值濾波是典型的線性濾波算法,它是指在圖像上對(duì)目標(biāo)像素給一個(gè)模板,該模板包括了其周圍的臨近像素(以目標(biāo)象素為中心的周圍 8 個(gè)像素,構(gòu)成一個(gè)濾波模板,即去掉目標(biāo)像素本身),再用模板中的全體像素的平均值來(lái)代替原來(lái)像素值。中值濾波算法可以形象的用上述表格來(lái)描述,即對(duì)于每個(gè) 33 的陣列而言,中間像素的值,等于邊緣 8 個(gè)像素的平均值。
ZYNQ圖像處理(6)——均值濾波和中值濾波
無(wú)論是直接獲取的灰度圖像,還是由彩色圖像轉(zhuǎn)換得到的灰度圖像,里面都有噪聲的存在,噪聲對(duì)圖像質(zhì)量有很大的影響。進(jìn)行中值濾波不僅可以去除孤點(diǎn)噪聲,而且可以保持圖像的邊緣特性,不會(huì)使圖像產(chǎn)生顯著的模糊,比較適合于實(shí)驗(yàn)中的人臉圖像。中值濾波算法與均值濾波非常的相似,但濾波的效果卻有很大的差別,區(qū)別如下:(1) 均值濾波相當(dāng)于低通濾波,有將圖像模糊化的趨勢(shì),對(duì)椒鹽噪聲基本無(wú)能力。(2) 中值濾波的有點(diǎn)事可以很好的過(guò)濾椒鹽噪聲,缺點(diǎn)是容易造成圖像的不連續(xù)。中值濾波的算法非常簡(jiǎn)單,只要求得 3
3 像素陣列的中間值即可,這樣就有效的移植了最大值與最小值,圖像會(huì)變得均勻,對(duì)椒鹽噪聲有很好的濾除效果!
《基于FPGA的實(shí)時(shí)中值濾波器的硬件實(shí)現(xiàn)》這篇文章中介紹了一種適合FPGA實(shí)現(xiàn)的快速尋找中值的算法,算法過(guò)程是這樣的:首先計(jì)算每一行的最大值、中值以及最小值;之后計(jì)算第一列最大值中的最小值,第二列中間值中的中間值,第三列最小值中的最大值;最后再次計(jì)算這三個(gè)值的中間值就可以得到中值了。
ZYNQ圖像處理(6)——均值濾波和中值濾波

二、3×3圖像矩陣的提取

可以發(fā)現(xiàn),無(wú)論是均值濾波還是中值濾波,一個(gè)必要的步驟就是得到3×3的圖像矩陣。這個(gè)圖像矩陣在matlab中很容易得到,因?yàn)閙atlab讀取的是整一張的圖片。但是在FPGA中對(duì)圖像的實(shí)時(shí)處理,則需要先緩存兩到三行的數(shù)據(jù),然后從這3行數(shù)據(jù)中獲得3×3圖像矩陣。
查閱了一些資料,發(fā)現(xiàn)在VIVADO中實(shí)現(xiàn)3×3矩陣有以下幾種方法。(1)第一種是利用vivado的IP核:ram based shift register,這個(gè)ip核在緩存數(shù)據(jù)量小的時(shí)候可以用。但是數(shù)據(jù)量很大,為幾百個(gè)以上的時(shí)候,緩存數(shù)量就不準(zhǔn)了,不知道是不是bug,因此不推薦使用。(2)第二種是利用RAM(3)第三種是利用fifo實(shí)現(xiàn),利用fifo實(shí)現(xiàn)野火教程很詳細(xì)。我這邊是利用了兩個(gè)ram實(shí)現(xiàn)數(shù)據(jù)的緩存和3×3矩陣的提取,接下來(lái)介紹實(shí)現(xiàn)過(guò)程。

2.1、例化ram ip核

首先自然是先需要例化一個(gè)ram的IP核,這個(gè)ram的配置信息如下如所示,是一個(gè)雙端口的ram,寬度8位,深度1024位,優(yōu)先寫(xiě)操作。詳細(xì)的可以看配置的圖。
ZYNQ圖像處理(6)——均值濾波和中值濾波
ZYNQ圖像處理(6)——均值濾波和中值濾波
ZYNQ圖像處理(6)——均值濾波和中值濾波

2.2、基于ram的移位寄存器

基于ram 的移位寄存器代碼如下圖所示。輸入端口有時(shí)鐘信號(hào)、時(shí)鐘使能信號(hào)、行同步信號(hào)、數(shù)據(jù)輸入信號(hào)。輸出端口有前一行數(shù)據(jù)、前前一行的數(shù)據(jù)。具體實(shí)現(xiàn)是這樣的,當(dāng)行同步和時(shí)鐘使能到來(lái)時(shí),地址開(kāi)始累加了,當(dāng)行同步結(jié)束,地址清零。之后對(duì)時(shí)鐘信號(hào)、地址信號(hào)、數(shù)據(jù)信號(hào)都延遲三拍。最后兩個(gè)ram分別存儲(chǔ)了前一行和前前一行的圖像。
比較關(guān)鍵的一點(diǎn)是,ram是先開(kāi)始讀,延遲幾個(gè)時(shí)鐘后才開(kāi)始寫(xiě),因?yàn)閯傞_(kāi)始是讀不到數(shù)據(jù)的,只有下一個(gè)行同步信號(hào)來(lái)的時(shí)候,前一行數(shù)據(jù)才會(huì)被讀出來(lái),這里比較繞。

module line_shift_RAM_8bit1(
	input clock,

	input          clken,
	input          per_frame_href,
	
	input   [7:0]  shiftin,  //當(dāng)前行的數(shù)據(jù)
	output  [7:0]  taps0x,   //前一行的數(shù)據(jù)
	output  [7:0]  taps1x    //前前一行的數(shù)據(jù)
);

//reg define
reg  [2:0]  clken_dly;
reg  [9:0]  ram_rd_addr;
reg  [9:0]  ram_rd_addr_d0;
reg  [9:0]  ram_rd_addr_d1;
reg  [9:0]  ram_rd_addr_d2;
reg  [7:0]  shiftin_d0;
reg  [7:0]  shiftin_d1;
reg  [7:0]  shiftin_d2;
reg  [7:0]  taps0x_d0;

//在數(shù)據(jù)到來(lái)時(shí),RAM的讀地址累加
always@(posedge clock)begin
	if(per_frame_href)
		if(clken)
			ram_rd_addr <= ram_rd_addr + 1 ;
		else
			ram_rd_addr <= ram_rd_addr ;
	else
		ram_rd_addr <= 0 ;
end

//對(duì)時(shí)鐘延遲3拍
always@(posedge clock) begin
	clken_dly <= { clken_dly[1:0] , clken };
end

//將RAM地址延遲3拍
always@(posedge clock ) begin
	ram_rd_addr_d0 <= ram_rd_addr;
	ram_rd_addr_d1 <= ram_rd_addr_d0;
	ram_rd_addr_d2 <= ram_rd_addr_d1;
end

//輸入數(shù)據(jù)延遲3拍送入RAM
always@(posedge clock)begin
	shiftin_d0 <= shiftin;
	shiftin_d1 <= shiftin_d0;
	shiftin_d2 <= shiftin_d1;
end

//用于存儲(chǔ)前一行圖像的RAM
blk_mem_gen_0  u_ram_1024x8_0(
  .clka   (clock),
  .wea    (clken_dly[2]),
  .addra  (ram_rd_addr_d2),     //在延遲的第三個(gè)時(shí)鐘周期,當(dāng)前行的數(shù)據(jù)寫(xiě)入RAM0
  .dina   (shiftin_d2),
  
  .clkb   (clock),
  .addrb  (ram_rd_addr),    
  .doutb  (taps0x)              //延遲一個(gè)時(shí)鐘周期,輸出RAM0中前一行圖像的數(shù)據(jù)
);

//寄存前一行圖像的數(shù)據(jù)
always@(posedge clock)begin
	taps0x_d0  <= taps0x;
end

//用于存儲(chǔ)前前一行圖像的RAM
blk_mem_gen_0  u_ram_1024x8_1(
	.clka   (clock),
	.wea    (clken_dly[1]),
	.addra  (ram_rd_addr_d1),
	.dina   (taps0x_d0),       //在延遲的第二個(gè)時(shí)鐘周期,將前一行圖像的數(shù)據(jù)寫(xiě)入RAM1

	.clkb   (clock),
	.addrb  (ram_rd_addr),
	.doutb  (taps1x)           //延遲一個(gè)時(shí)鐘周期,輸出RAM1中前前一行圖像的數(shù)據(jù)
);

endmodule

我這邊結(jié)合仿真說(shuō)一下,當(dāng)clken[2]信號(hào)為高時(shí),開(kāi)始往里邊寫(xiě)信號(hào),可以看到第一次是把十六進(jìn)制51寫(xiě)到了地址0中,但是可以發(fā)現(xiàn)讀地址是已經(jīng)到了3了,所以讀速度是比寫(xiě)速度快了三個(gè)時(shí)鐘周期,因?yàn)橄乱粋€(gè)行同步來(lái)時(shí)才可以得到上一行數(shù)據(jù)。
ZYNQ圖像處理(6)——均值濾波和中值濾波
可以看到,下面這張圖就是下一個(gè)行同步時(shí)間內(nèi),下一行數(shù)據(jù)從taps0x中讀了出來(lái)。taps1x也是同樣的道理,這邊不在敘述。
ZYNQ圖像處理(6)——均值濾波和中值濾波

2.3、3×3圖像矩陣提取

3×3圖像矩陣提取的代碼如下圖所示,代碼本身比較簡(jiǎn)單,就是將輸入信號(hào)緩存,然后提取出矩陣。這里需要注意信號(hào)的同步,得到3×3矩陣信號(hào)要比進(jìn)來(lái)的信號(hào)慢了兩個(gè)時(shí)鐘周期。所以需要延遲兩拍。

module  VIP_matrix_generate
(
	input				clk,  		
	input				rst_n,				

	input				per_frame_vsync,
	input				per_frame_href,
	input				per_frame_clken,
	input        [7:0]  per_img_Y,

	output				matrix_frame_vsync,
	output				matrix_frame_href,
	output				matrix_frame_clken,
	output	reg  [7:0]  matrix_p11, 
	output	reg  [7:0]  matrix_p12,
	output	reg  [7:0]  matrix_p13,
	output	reg	 [7:0]  matrix_p21, 
	output	reg  [7:0]  matrix_p22, 
	output	reg  [7:0]  matrix_p23,
	output	reg	 [7:0]  matrix_p31, 
	output	reg  [7:0]  matrix_p32, 
	output	reg  [7:0]  matrix_p33
);

//wire define
wire  [7:0]  row1_data;
wire  [7:0]  row2_data;
wire	     read_frame_href ;
wire	     read_frame_clken;

//reg define
reg  [7:0]  row3_data;
reg  [1:0]  per_frame_vsync_r;
reg  [1:0]  per_frame_href_r;
reg  [1:0]  per_frame_clken_r;

assign	read_frame_href    = per_frame_href_r[0] ;
assign	read_frame_clken   = per_frame_clken_r[0];
assign	matrix_frame_vsync = per_frame_vsync_r[1];
assign	matrix_frame_href  = per_frame_href_r[1] ;
assign	matrix_frame_clken = per_frame_clken_r[1];

//present signal
always@(posedge clk or negedge rst_n) begin
	if(!rst_n)
		row3_data <= 0;
	else begin		
		if(per_frame_clken)
			row3_data <= per_img_Y ;
		else
			row3_data <= row3_data ;
	end
end


line_shift_RAM_8bit1 u_line_shift_RAM_8bit1(
    .clock          ( clk               ),
    .clken          ( per_frame_clken   ),
    .per_frame_href ( per_frame_href    ),
    .shiftin        ( per_img_Y         ),
    .taps0x         ( row2_data         ),
    .taps1x         ( row1_data         )
);


//delay 2 tclk
always@(posedge clk or negedge rst_n) begin
	if(!rst_n) begin		
		per_frame_vsync_r <= 0;
		per_frame_href_r  <= 0;
		per_frame_clken_r <= 0;
	end
	else begin		
		per_frame_vsync_r <= { per_frame_vsync_r[0], per_frame_vsync };
		per_frame_href_r  <= { per_frame_href_r[0],  per_frame_href  };
		per_frame_clken_r <= { per_frame_clken_r[0], per_frame_clken };
	end
end

//generate the 3X3 matrix 
always@(posedge clk or negedge rst_n) begin
	if(!rst_n) begin		
		{matrix_p11, matrix_p12, matrix_p13} <= 24'h0;
		{matrix_p21, matrix_p22, matrix_p23} <= 24'h0;
		{matrix_p31, matrix_p32, matrix_p33} <= 24'h0;
	end
	else if(read_frame_href) begin
		if(read_frame_clken) begin			
			{matrix_p11, matrix_p12, matrix_p13} <= {matrix_p12, matrix_p13, row1_data};
			{matrix_p21, matrix_p22, matrix_p23} <= {matrix_p22, matrix_p23, row2_data};
			{matrix_p31, matrix_p32, matrix_p33} <= {matrix_p32, matrix_p33, row3_data};
		end
		else begin			
			{matrix_p11, matrix_p12, matrix_p13} <= {matrix_p11, matrix_p12, matrix_p13};
			{matrix_p21, matrix_p22, matrix_p23} <= {matrix_p21, matrix_p22, matrix_p23};
			{matrix_p31, matrix_p32, matrix_p33} <= {matrix_p31, matrix_p32, matrix_p33};
		end	
	end
	else begin		
		{matrix_p11, matrix_p12, matrix_p13} <= 24'h0;
		{matrix_p21, matrix_p22, matrix_p23} <= 24'h0;
		{matrix_p31, matrix_p32, matrix_p33} <= 24'h0;
	end
end

endmodule

仿真的結(jié)果如下面三張圖所示,當(dāng)pei_img_Y數(shù)據(jù)來(lái)到的時(shí)候,延遲兩個(gè)時(shí)鐘周期進(jìn)入到row3_data中,之后在延遲一個(gè)周期數(shù)據(jù)送到p31、p32以及p33中。row2_data和row1_data的得到也是同樣的原理。
ZYNQ圖像處理(6)——均值濾波和中值濾波
ZYNQ圖像處理(6)——均值濾波和中值濾波
ZYNQ圖像處理(6)——均值濾波和中值濾波

三、均值濾波的實(shí)現(xiàn)

前面已經(jīng)清楚描述了均值濾波的實(shí)現(xiàn)過(guò)程,主要就是將圖像像素點(diǎn)周圍8個(gè)像素的值加起來(lái)然后除以8就可以了,下面式均值濾波的實(shí)現(xiàn)代碼。

module mean_filter(
    input clk,
    input rst_n,

    input [23:0] pre_data,
    input per_vsync,
    input per_href,
    input per_clken,
    
    output [23:0] post_data,
    output post_vsync,
    output post_href,
    output post_clken
);

//-----------------------------
//generate 3×3 picture matrix
//-----------------------------
wire matrix_frame_clken;
wire matrix_frame_href;
wire matrix_frame_vsync;
wire [7:0] matrix_p11;
wire [7:0] matrix_p12;
wire [7:0] matrix_p13;
wire [7:0] matrix_p21;
wire [7:0] matrix_p22;
wire [7:0] matrix_p23;
wire [7:0] matrix_p31;
wire [7:0] matrix_p32;
wire [7:0] matrix_p33;

VIP_matrix_generate u_VIP_matrix_generate(
    .clk                ( clk                ),
    .rst_n              ( rst_n              ),
    .per_frame_vsync    ( per_vsync   	 	 ),
    .per_frame_href     ( per_href           ),
    .per_frame_clken    ( per_clken      	 ),
    .per_img_Y          ( pre_data[7:0]      ),
    .matrix_frame_vsync ( matrix_frame_vsync ),
    .matrix_frame_href  ( matrix_frame_href  ),
    .matrix_frame_clken ( matrix_frame_clken ),
    .matrix_p11         ( matrix_p11         ),
    .matrix_p12         ( matrix_p12         ),
    .matrix_p13         ( matrix_p13         ),
    .matrix_p21         ( matrix_p21         ),
    .matrix_p22         ( matrix_p22         ),
    .matrix_p23         ( matrix_p23         ),
    .matrix_p31         ( matrix_p31         ),
    .matrix_p32         ( matrix_p32         ),
    .matrix_p33         ( matrix_p33         )
);

//-----------------------------
//mean filter function
//-----------------------------
reg [11:0] add_p1;
reg [11:0] add_p2;
reg [11:0] add_p3;
reg [11:0] add_all;
//step1:add every href
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
        add_p1<=12'd0;
        add_p2<=12'd0;
        add_p3<=12'd0;
    end
    else begin
      add_p1<=matrix_p11+matrix_p12+matrix_p13;
      add_p2<=matrix_p21+matrix_p23;
      add_p3<=matrix_p31+matrix_p32+matrix_p33;
    end
end
//step2:add all the data
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
        add_all<=12'd0;
    end
    else begin
        add_all<=add_p1+add_p2+add_p3;
    end
end
//step3:shift to get mean filter data
assign post_data={3{add_all[10:3]}};

//-----------------------------
//clk signal synchronization
//-----------------------------
reg [1:0] post_clken_dy;
reg [1:0] post_href_dy;
reg [1:0] post_vsync_dy;
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
        post_clken_dy<=2'd0;
        post_href_dy<=2'd0;
        post_vsync_dy<=2'd0;
    end
    else begin
        post_clken_dy<={post_clken_dy[0],matrix_frame_clken};
        post_href_dy<={post_href_dy[0],matrix_frame_href};
        post_vsync_dy<={post_vsync_dy[0],matrix_frame_vsync};
    end
end
assign post_clken=post_clken_dy[1];
assign post_href=post_href_dy[1];
assign post_vsync=post_vsync_dy[1];

endmodule 

然后下面兩張圖分別是我用vivado仿真的加了椒鹽噪聲之后的圖片以及均值濾波之后的圖片??梢园l(fā)現(xiàn),均值濾波片讓圖片變得模糊了,而且椒鹽噪聲也沒(méi)有有效濾除。這邊的vivado仿真圖像處理是用verilog去模擬了攝像頭的產(chǎn)生時(shí)序,實(shí)現(xiàn)過(guò)程是參考了b站up主大磊FPGA。
ZYNQ圖像處理(6)——均值濾波和中值濾波
ZYNQ圖像處理(6)——均值濾波和中值濾波

四、中值濾波的實(shí)現(xiàn)

中值濾波的實(shí)現(xiàn)和均值濾波相似,也是需要先提取3×3的圖像矩陣,然后提取9個(gè)值中的中值,提取的方法在上面也講到了。
首先下面是對(duì)三個(gè)輸出信號(hào)進(jìn)行排序的代碼,分別排序并且輸出最大值,中間值以及最小值。

module sort_three(
    input clk,
    input rst_n,
    input [7:0] data1,
    input [7:0] data2,
    input [7:0] data3,
    
    output reg [7:0] max_data,
    output reg [7:0] mid_data,
    output reg [7:0] min_data

);

//find max,mid and min data 
//one clk to finish
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
      max_data<=8'd0;
      mid_data<=8'd0;
      min_data<=8'd0;
    end
    else if (data1>=data2 && data2>=data3)begin
        max_data<=data1;
        mid_data<=data2;
        min_data<=data3;
    end
    else if (data1>=data3 && data3>=data2)begin
        max_data<=data1;
        mid_data<=data3;
        min_data<=data2;
    end
    else if (data2>=data1 && data1>=data3)begin
        max_data<=data2;
        mid_data<=data1;
        min_data<=data3;
    end
    else if (data2>=data3 && data3>=data1)begin
        max_data<=data2;
        mid_data<=data3;
        min_data<=data1;
    end
    else if (data3>=data1 && data1>=data2)begin
        max_data<=data3;
        mid_data<=data1;
        min_data<=data2;
    end
    else if (data3>=data2 && data2>=data1)begin
        max_data<=data3;
        mid_data<=data2;
        min_data<=data1;
    end
end

endmodule 

之后是中值濾波的代碼,這部分實(shí)現(xiàn)的原理就是上文說(shuō)到的提取中值的過(guò)程。

module median_filter(
    input clk,
    input rst_n,

    input [23:0] per_data,
    input per_vsync,
    input per_href,
    input per_clken,
    
    output [23:0] post_data,
    output post_vsync,
    output post_href,
    output post_clken
);

//-----------------------------
//generate 3×3 picture matrix
//-----------------------------
wire matrix_frame_clken;
wire matrix_frame_href;
wire matrix_frame_vsync;
reg [2:0] post_clken_dy;
reg [2:0] post_href_dy;
reg [2:0] post_vsync_dy;
wire [7:0] matrix_p11;
wire [7:0] matrix_p12;
wire [7:0] matrix_p13;
wire [7:0] matrix_p21;
wire [7:0] matrix_p22;
wire [7:0] matrix_p23;
wire [7:0] matrix_p31;
wire [7:0] matrix_p32;
wire [7:0] matrix_p33;

VIP_matrix_generate u_VIP_matrix_generate(
    .clk                ( clk                ),
    .rst_n              ( rst_n              ),
    .per_frame_vsync    ( per_vsync   	 	 ),
    .per_frame_href     ( per_href           ),
    .per_frame_clken    ( per_clken      	 ),
    .per_img_Y          ( per_data[7:0]      ),
    .matrix_frame_vsync ( matrix_frame_vsync ),
    .matrix_frame_href  ( matrix_frame_href  ),
    .matrix_frame_clken ( matrix_frame_clken ),
    .matrix_p11         ( matrix_p11         ),
    .matrix_p12         ( matrix_p12         ),
    .matrix_p13         ( matrix_p13         ),
    .matrix_p21         ( matrix_p21         ),
    .matrix_p22         ( matrix_p22         ),
    .matrix_p23         ( matrix_p23         ),
    .matrix_p31         ( matrix_p31         ),
    .matrix_p32         ( matrix_p32         ),
    .matrix_p33         ( matrix_p33         )
);

//---------------------------------------------------
//              midian filter function
//---------------------------------------------------
//[a11 a12 a13]             [max1 med1 min1]
//[a21 a22 a23]      to     [max2 med2 min2]
//[a31 a32 a33]             [max3 med3 min3]  
//                                 to
//                 [min_of_max med_of_med max_of_min]
//                                to
//                               [med]    
wire [7:0] max_data_1;
wire [7:0] mid_data_1;
wire [7:0] min_data_1;
wire [7:0] max_data_2;
wire [7:0] mid_data_2;
wire [7:0] min_data_2;
wire [7:0] max_data_3;
wire [7:0] mid_data_3;
wire [7:0] min_data_3;
wire [7:0] max_data_4;
wire [7:0] mid_data_4;
wire [7:0] min_data_4;
wire [7:0] max_data_5;
wire [7:0] mid_data_5;
wire [7:0] min_data_5;
wire [7:0] max_data_6;
wire [7:0] mid_data_6;
wire [7:0] min_data_6;
wire [7:0] max_data_7;
wire [7:0] mid_data_7;
wire [7:0] min_data_7;

//step1:every line find max,mid and min data
sort_three u_sort_three_1(
    .clk      ( clk              ),
    .rst_n    ( rst_n            ),
    .data1    ( matrix_p11       ),
    .data2    ( matrix_p12       ),
    .data3    ( matrix_p13       ),
    .max_data ( max_data_1       ),
    .mid_data ( mid_data_1       ),
    .min_data ( min_data_1       )
);
sort_three u_sort_three_2(
    .clk      ( clk              ),
    .rst_n    ( rst_n            ),
    .data1    ( matrix_p21       ),
    .data2    ( matrix_p22       ),
    .data3    ( matrix_p23       ),
    .max_data ( max_data_2       ),
    .mid_data ( mid_data_2       ),
    .min_data ( min_data_2       )
);
sort_three u_sort_three_3(
    .clk      ( clk              ),
    .rst_n    ( rst_n            ),
    .data1    ( matrix_p31       ),
    .data2    ( matrix_p32       ),
    .data3    ( matrix_p33       ),
    .max_data ( max_data_3       ),
    .mid_data ( mid_data_3       ),
    .min_data ( min_data_3       )
);
//step2:every line find min_of_max,med_of_med,max_of_min
sort_three u_sort_three_4(
    .clk      ( clk              ),
    .rst_n    ( rst_n            ),
    .data1    ( max_data_1       ),
    .data2    ( max_data_2       ),
    .data3    ( max_data_3       ),
    .max_data ( max_data_4       ),
    .mid_data ( mid_data_4       ),
    .min_data ( min_data_4       )
);
sort_three u_sort_three_5(
    .clk      ( clk              ),
    .rst_n    ( rst_n            ),
    .data1    ( mid_data_1       ),
    .data2    ( mid_data_2       ),
    .data3    ( mid_data_3       ),
    .max_data ( max_data_5       ),
    .mid_data ( mid_data_5       ),
    .min_data ( min_data_5       )
);
sort_three u_sort_three_6(
    .clk      ( clk              ),
    .rst_n    ( rst_n            ),
    .data1    ( min_data_1       ),
    .data2    ( min_data_2       ),
    .data3    ( min_data_3       ),
    .max_data ( max_data_6       ),
    .mid_data ( mid_data_6       ),
    .min_data ( min_data_6       )
);
//step3:find median value
sort_three u_sort_three_7(
    .clk      ( clk              ),
    .rst_n    ( rst_n            ),
    .data1    ( min_data_4       ),
    .data2    ( mid_data_5       ),
    .data3    ( max_data_6       ),
    .max_data ( max_data_7       ),
    .mid_data ( mid_data_7       ),
    .min_data ( min_data_7       )
);
assign post_data={3{mid_data_7}};

//-----------------------------
//   signal synchronization
//-----------------------------
assign post_clken=post_clken_dy[2];
assign post_href=post_href_dy[2];
assign post_vsync=post_vsync_dy[2];
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
        post_clken_dy<=3'd0;
        post_href_dy<=3'd0;
        post_vsync_dy<=3'd0;
    end
    else begin
        post_clken_dy<={post_clken_dy[1:0],matrix_frame_clken};
        post_href_dy<={post_href_dy[1:0],matrix_frame_href};
        post_vsync_dy<={post_vsync_dy[1:0],matrix_frame_vsync};
    end
end

endmodule

接下來(lái)是中值濾波的仿真結(jié)果,我打個(gè)比方,比如下面69這個(gè)數(shù)值是輸出的中值。獲得中值需要消耗三個(gè)時(shí)鐘周期,因此矩陣數(shù)據(jù)比中值要快三個(gè)時(shí)鐘周期,所以和這個(gè)中值對(duì)應(yīng)的矩陣數(shù)據(jù)是:36、36、36、d7、bc、36、ff、f5、69。對(duì)應(yīng)中值就是69,這邊顯示696969是把8位數(shù)據(jù)拼接成了24位的。
ZYNQ圖像處理(6)——均值濾波和中值濾波
最后給出的這三張圖片一次是加了椒鹽噪聲的RGB圖片,均值濾波后的圖片以及中值濾波后的圖片??梢悦黠@看到,中值濾波對(duì)椒鹽噪聲的濾除作用明顯。
ZYNQ圖像處理(6)——均值濾波和中值濾波
ZYNQ圖像處理(6)——均值濾波和中值濾波
ZYNQ圖像處理(6)——均值濾波和中值濾波

五、總結(jié)

均值濾波和中值濾波是圖像處理的基本操作,主要核心都是提取3×3的圖像矩陣。因?yàn)楝F(xiàn)在的攝像頭含噪聲很少,所有沒(méi)有放到FPGA開(kāi)發(fā)板中進(jìn)行測(cè)試,只是對(duì)其進(jìn)行了matlab和vivado的仿真。后面做完這部分基礎(chǔ)的圖像處理后我整理下代碼并供大家參考。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-472595.html

到了這里,關(guān)于ZYNQ圖像處理(6)——均值濾波和中值濾波的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Opencv-C++筆記 (13) : opencv-圖像卷積一(均值、中值、高斯、雙邊濾波)與 邊緣處理

    Opencv-C++筆記 (13) : opencv-圖像卷積一(均值、中值、高斯、雙邊濾波)與 邊緣處理

    頭文件 quick_opencv.h:聲明類與公共函數(shù) 主函數(shù)調(diào)用 src:輸入圖像 。 dst:輸出圖像 。 ksize:內(nèi)核大小 ,一般用 Size(w,h),w 為寬度,h 為深度。 anchor:被平滑的點(diǎn),表示取 內(nèi)核中心 ,默認(rèn)值 Point(-1,-1)。 boderType:推斷圖像外部像素的某種邊界模式。默認(rèn)值 BORDER_DEFAULT 目的:

    2024年02月16日
    瀏覽(920)
  • 【C++】【圖像處理】均值濾波 and 高斯濾波 and 中值濾波 and Sobel算子邊緣提?。ǖ屯V波)算法解析(以.raw格式的圖像為基礎(chǔ)進(jìn)行圖像處理、gray levels:256)

    ?中值濾波: 中值濾波中的MidValueFind函數(shù)的實(shí)現(xiàn)就是冒泡排序,最后去中間值返回: ?Soble算子邊緣提取: ? ? 總結(jié): 1、均值、高斯濾波和Sobel算子邊緣提取的核心,創(chuàng)建卷積核并確定各個(gè)點(diǎn)上的權(quán)重,然后將邊緣灰度級(jí)歸零(是否邊緣歸零按業(yè)務(wù)需求決定),提取非邊緣像

    2024年02月05日
    瀏覽(29)
  • 【C++】【圖像處理】均值濾波 and 高斯濾波 and 中值濾波 (低通濾波器)and Sobel算子邊緣提取算法解析(以.raw格式的圖像為基礎(chǔ)進(jìn)行圖像處理、gray levels:256)

    ?中值濾波: 中值濾波中的MidValueFind函數(shù)的實(shí)現(xiàn)就是冒泡排序,最后去中間值返回: ?Soble算子邊緣提?。?? ? 總結(jié): 1、均值、高斯濾波和Sobel算子邊緣提取的核心,創(chuàng)建卷積核并確定各個(gè)點(diǎn)上的權(quán)重,然后將邊緣灰度級(jí)歸零(是否邊緣歸零按業(yè)務(wù)需求決定),提取非邊緣像

    2024年02月05日
    瀏覽(26)
  • 算法 | 數(shù)字圖像處理之「中值濾波」

    算法 | 數(shù)字圖像處理之「中值濾波」

    中值濾波就是用一個(gè)奇數(shù)點(diǎn)的移動(dòng)窗口(要求奇數(shù)主要是為了保證整個(gè)模板有唯一中心元素),將窗口中心點(diǎn)的值用窗口內(nèi)各點(diǎn)的中值代替。假設(shè)窗口內(nèi)有5點(diǎn),其值為80、90、200、110和120,那么此窗口內(nèi)各點(diǎn)的中值即為110。 設(shè)有一個(gè)一維序列 (f_1,f_2,...,f_n) ,取窗口長(zhǎng)度(點(diǎn)

    2023年04月13日
    瀏覽(30)
  • FPGA圖像處理_中值濾波實(shí)現(xiàn)(含源碼)

    FPGA圖像處理_中值濾波實(shí)現(xiàn)(含源碼)

    非線性濾波器在通常情況下沒(méi)有特定的轉(zhuǎn)移函數(shù)。一類比較重要的非線性濾波就是統(tǒng)計(jì)排序?yàn)V波器,統(tǒng)計(jì)排序?yàn)V波器即對(duì)窗口內(nèi)的像素值進(jìn)行排序并通過(guò)多路選擇器選擇使用排序后的值,例如中值濾波、最大/最小值濾波等。排序?yàn)V波器或者其組合,可以在很多圖像處理的場(chǎng)合

    2023年04月15日
    瀏覽(26)
  • 圖像處理:均值濾波算法

    圖像處理:均值濾波算法

    目錄 前言 概念介紹 基本原理 Opencv實(shí)現(xiàn)均值濾波 Python手寫(xiě)實(shí)現(xiàn)均值濾波 參考文章 在此之前,我曾在此篇中推導(dǎo)過(guò)圖像處理:推導(dǎo)五種濾波算法(均值、中值、高斯、雙邊、引導(dǎo))。這在此基礎(chǔ)上,我想更深入地研究和推導(dǎo)這些算法,以便為將來(lái)處理圖像的項(xiàng)目打下基礎(chǔ)。

    2023年04月23日
    瀏覽(27)
  • Matlab圖像處理-均值濾波

    Matlab圖像處理-均值濾波

    均值濾波 均值濾波所使用的運(yùn)算是卷積。均值濾波用鄰域內(nèi)像素的平均值來(lái)代替中心像素的值,相當(dāng)于低通濾波,有將圖像模糊化的趨勢(shì),對(duì)椒鹽噪聲基本無(wú)能為力。 在 MATLAB 中,可使用 imfilter 函數(shù) 來(lái)實(shí)現(xiàn)線性空間濾波,該函數(shù)的語(yǔ)法如下 : J = imfilter ( I,w,filtering_mode,bound

    2024年02月06日
    瀏覽(30)
  • 數(shù)字圖像處理(七)均值濾波

    數(shù)字圖像處理(七)均值濾波

    題目:使用均值濾波器對(duì)圖像進(jìn)行濾波。 采用國(guó)際標(biāo)準(zhǔn)測(cè)試圖像Lena。 3*3的均值濾波器定義如下: c++代碼: 結(jié)果展示: 均值濾波器的特點(diǎn): 計(jì)算均值會(huì)將圖像中的邊緣信息和特征信息模糊掉,丟失很多特征,使得景物的清晰度降低,畫(huà)面變得模糊。對(duì)于高斯噪聲,當(dāng)濾波器

    2024年02月11日
    瀏覽(22)
  • 【圖像處理OpenCV(C++版)】——5.4 圖像平滑之中值平滑(濾波)

    【圖像處理OpenCV(C++版)】——5.4 圖像平滑之中值平滑(濾波)

    前言 : ?????? 歡迎來(lái)到本博客 ?????? ?????? 本專欄主要結(jié)合OpenCV和C++來(lái)實(shí)現(xiàn)一些基本的圖像處理算法并詳細(xì)解釋各參數(shù)含義,適用于平時(shí)學(xué)習(xí)、工作快速查詢等,隨時(shí)更新。 ?????? 具體食用方式:可以點(diǎn)擊本專欄【OpenCV快速查找(更新中)】–搜索你要查詢的算子

    2024年02月10日
    瀏覽(89)
  • FPGA圖像處理仿真實(shí)驗(yàn)——均值濾波(FIFO)

    FPGA圖像處理仿真實(shí)驗(yàn)——均值濾波(FIFO)

    ????????之前的博客中用shift ram做的均值濾波,那篇文章里講了原理,在這里不進(jìn)行重復(fù)??紤]到shift ram的深度有限,在處理高分辨率圖片時(shí)可能會(huì)收到限制,所以這次采用FIFO來(lái)進(jìn)行均值濾波。FIFO可以看成是一個(gè)先進(jìn)先出的堆棧,有兩個(gè)獨(dú)立的讀使能信號(hào)和寫(xiě)使能信號(hào),

    2024年02月13日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包