8.均值滤波

news2024/11/29 2:50:17

1 简介

  均值滤波是一种低通滤波,它可以有效过滤图片中的椒盐噪声,但是副作用也同样明显,会使图片的边缘过于模糊。
  均值滤波的卷积核系数均为1。
  这里最终重复一下算法实现以及验证的步骤:
    1.MATLAB读取图片并转化为TXT格式,命名为pre.txt。
    2.ModelSim读取pre.txt文本并输入给FPGA实现的算法模块进行仿真,并将仿真后的数据写入TXT文本,命名为post.txt。
    3.MATLAB对读取图像并用算法对图像进行处理,同时读取步骤2的post.txt文本进行数据对比,如果数据完全一致,则FPGA算法实现与MALAB算法实现均正确。
    4.MATLAB读取post.txt转化为图片,查看算法实现效果。
  由步骤可知MATLAB共有三个文件,一个图片转TXT,一个算法实现与比较,一个TXT转图片。

2 MATLAB的格式转换

  本试验采用的图片为第六章的RGB转YCBCR最后生成的图片。点击此处跳转到文章,
  转化的MATLAB代码为:

clear;
clc;
close all;
a = imread('../img/gray.bmp');
imshow(a);
[row,col] = size(a);

p_fid = fopen('../data/pre.txt','w+');
for i = 1:row
     for j = 1:col 
           fprintf(p_fid,'%02x' ,a(i,j));
           fprintf(p_fid,'\n');
     end
 end
fclose(p_fid);

3 均值滤波的FPGA实现与仿真。

  均值滤波要用到3X3的卷积核,这里我们选择边沿复制的方式,卷积核系数均为1,卷积核的生成方式查看第七章点击跳转,在此模块的基础上继续编写均值滤波部分。由于均值滤波需要除以9,在FPGA中的除法实现较为消耗资源与时间,除以9采用先乘以7281再除以65536来实现。

3.1 均值滤波的FPGA实现

3.1.1 3X3卷积核实现

module 	padding_matrix #(
	parameter 	COL 	= 	1920 	 	,
	parameter 	ROW 	= 	1080 	 	,
	parameter 	PADDING = 	0 		 	
)(
 	input 	wire 			clk 		,
 	input 	wire 			rst_n 		,

 	input 	wire 	[7:0] 	data 		,
 	input 	wire 	 		data_de 	, 

 	output 	wire  			matrix_de 	,
 	output 	reg 	[7:0] 	matrix11 	,
 	output 	reg 	[7:0] 	matrix12 	,
 	output 	reg 	[7:0] 	matrix13 	,
 	output 	reg 	[7:0] 	matrix21 	,
 	output 	reg 	[7:0] 	matrix22 	,
 	output 	reg 	[7:0] 	matrix23 	,
 	output 	reg 	[7:0] 	matrix31 	,
 	output 	reg 	[7:0] 	matrix32 	,
 	output 	reg 	[7:0] 	matrix33 	
);



reg 	[1:0] 	 data_de_r 	;
reg 	[7:0] 	 data_r1 	;
reg 	[7:0] 	 data_r2 	;

reg 	[15:0] 	 col_cnt 	;
reg 	[15:0] 	 row_cnt 	;	

reg 			data_valid 	;
reg 	[4:0]	data_valid_r;
reg 			fake_data_valid;

wire 	[7:0] 	row1_data 	;
wire 	[7:0] 	row2_data 	;
reg 	[7:0] 	row3_data 	;

wire  	[1:0] 	padding 	;
assign 	padding  	= 	PADDING;

always @(posedge clk )begin
	data_de_r <= {data_de_r[1:0],data_de};
	data_valid_r 	<= 	{data_valid_r[3:0],data_valid};
	data_r1 	<= 	data 		;
end
wire 	pos_data_de;
assign 	pos_data_de = {data_de_r[0],data_de} == 2'b01;

always @(posedge clk or negedge rst_n)begin
	if(rst_n == 0)begin
		col_cnt 	<= 0;
	end
	else if(col_cnt == COL + 1)begin
		col_cnt 	<= 0;
	end
	else if(data_valid || fake_data_valid)begin
		col_cnt 	<= col_cnt + 1;
	end
end

always @(posedge clk or negedge rst_n)begin
	if(rst_n == 0)begin
		row_cnt 	<= 0;
	end
	else if(col_cnt == COL + 1 && row_cnt == ROW )begin
		row_cnt	 	<= 0;
	end
	else if(col_cnt == COL + 1)begin
		row_cnt 	<= row_cnt + 1;
	end
end

always @(posedge clk or negedge rst_n) begin
	if (rst_n == 0) begin		
		fake_data_valid 	<= 0;
	end
	else if (data_valid_r[4] == 0 && row_cnt == ROW && col_cnt <= COL  ) begin
		fake_data_valid 	<= 1;
	end
	else begin
		fake_data_valid 	<= 	0;
	end
end

always @(posedge clk or negedge rst_n)begin
	if(rst_n == 0)begin
		row3_data 	<= 0;
	end
	else if(col_cnt == 0 && pos_data_de && padding == 0)begin
		row3_data 	<= 0 ;
	end
	else if(col_cnt == 0 && pos_data_de && padding == 1)begin
		row3_data 	<= 8'hFF ;
	end
	else if(col_cnt == 0 && pos_data_de)begin
		row3_data 	<= data ;
	end
	else if(col_cnt == COL && data_de_r[1] && padding == 0)begin
		row3_data 	<= 0;
	end
	else if(col_cnt == COL && data_de_r[1] && padding == 1)begin
		row3_data 	<= 8'hFF;
	end
	else if(col_cnt == COL && data_de_r[1])begin
		row3_data 	<= row3_data;
	end
	else begin
		row3_data 	<= data_r1;
	end
end

always@(posedge clk or negedge rst_n)begin
	if(rst_n == 0)begin
		data_valid <= 0;
	end
	else if(data_de || data_de_r[1])begin
		data_valid <= 1'b1;
	end
	else begin
		data_valid <= 1'b0;
	end
end

wire 			rd_en 	;	

fifo_matrix_buf u1_fifo_matrix_buf (
	.rst 		(!rst_n		),  
	.wr_clk 	(clk  	 	),  
	.rd_clk 	(clk 	 	),  
	.din 		(row2_data 	),  
	.wr_en 		(data_valid ),  
	.rd_en 		(rd_en 	 	),  
	.dout 		(row1_data 	),  
	.full 		( 	 		),  
	.empty 		( 	 		)   
);

fifo_matrix_buf u2_fifo_matrix_buf (
	.rst 		(!rst_n		),  
	.wr_clk 	(clk  	 	),  
	.rd_clk 	(clk 	 	),  
	.din 		(row3_data 	),  
	.wr_en 		(data_valid ),  
	.rd_en 		(rd_en 		),  
	.dout 		(row2_data 	), 
	.full 		(   		),  
	.empty 		(    		)   
);

assign rd_en = (row_cnt > 0 & (data_valid | fake_data_valid) )? 1'b1 : 1'b0;

always @(posedge clk or negedge rst_n)begin
	if(rst_n == 0)begin
		{matrix11,matrix12,matrix13} 	<= 	24'd0;
		{matrix21,matrix22,matrix23} 	<= 	24'd0;
		{matrix31,matrix32,matrix33} 	<= 	24'd0;
	end
	else if(rd_en)begin
 		if(row_cnt == 1)begin
			if (padding == 0) begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,  	8'h0};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				
			end
			if (padding == 1) begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,    8'hFF};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				
			end
			else begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row2_data};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				
			end
 		end	
 		else if (row_cnt == ROW) begin
			if (padding == 0) begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,     8'h0};				
			end
			else if(padding == 1) begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,    8'hff};				
			end
			else begin
				{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};
				{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
				{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row2_data};				
			end			
 		end
 		else begin
			{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};
			{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};
			{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};
 		end	
	end

end

reg 	[2:0] 	rd_en_r;
always @(posedge clk)begin
	rd_en_r 	<= 	{rd_en_r[1:0],rd_en};
end

assign 	matrix_de 	= 	rd_en_r[2] & rd_en_r[0] ;
endmodule 	

3.1.2 均值滤波算法的FPGA实现

`timescale 1ns / 1ps

module ave_filter#(
    parameter DW = 8
)(
    input   wire                clk         ,
    input   wire                rst_n       ,

    input   wire                matrix_de   ,
    input   wire    [DW-1:0]    matrix11    ,
    input   wire    [DW-1:0]    matrix12    ,
    input   wire    [DW-1:0]    matrix13    ,
    input   wire    [DW-1:0]    matrix21    ,
    input   wire    [DW-1:0]    matrix22    ,
    input   wire    [DW-1:0]    matrix23    ,
    input   wire    [DW-1:0]    matrix31    ,
    input   wire    [DW-1:0]    matrix32    ,
    input   wire    [DW-1:0]    matrix33    ,

    output  wire                ave_data_de ,
    output  wire    [DW-1:0]    ave_data 
    );

reg     [2:0]           matrix_de_r     ;

reg     [DW+1:0]        one_line        ;
reg     [DW+1:0]        two_line        ;
reg     [DW+1:0]        three_line      ;
reg     [DW+3:0]        sum_matrix      ;
reg     [DW+15:0]       pre_ave_data    ;

always @(posedge clk)begin
    if(rst_n == 0)begin
        matrix_de_r     <=  0;
    end 
    else begin
        matrix_de_r     <=  {matrix_de_r[1:0],matrix_de};
    end
end 

always @(posedge clk)begin
    if(rst_n == 0)begin
        one_line    <=  0;
        two_line    <=  0;
        three_line  <=  0;
    end 
    else if(matrix_de)begin
        one_line    <=  matrix11 + matrix12 + matrix13;
        two_line    <=  matrix21 + matrix22 + matrix23;
        three_line  <=  matrix31 + matrix32 + matrix33;
    end
    else begin
        one_line    <=  0;
        two_line    <=  0;
        three_line  <=  0;
    end
end

always @(posedge clk)begin
    if(rst_n == 0)begin
        sum_matrix  <=  0;
    end 
    else if(matrix_de_r[0])begin
        sum_matrix  <=  one_line + two_line + three_line ;
    end
    else begin
        sum_matrix  <=  0;
    end
end

always @(posedge clk)begin
    if(rst_n == 0)begin
        pre_ave_data    <=  0;
    end 
    else if(matrix_de_r[1])begin
        pre_ave_data    <=  sum_matrix * 7281;
    end
    else begin
        pre_ave_data    <=  0;
    end
end

assign  ave_data    =   pre_ave_data[DW+15:16];
assign  ave_data_de = matrix_de_r[2];
endmodule

3.1.3 3X3卷积核生成与均值滤波模块的连接

`timescale 1ns / 1ps
module top_ave_filter#(
    parameter COL       = 1920  ,
    parameter ROW       = 1080  ,
    parameter PADDING   = 2     ,
    parameter DW        = 8     
)(
    input   wire                clk             ,
    input   wire                rst_n           ,
    input   wire                data_de         ,
    input   wire    [DW-1:0]    data            ,
    output  wire                ave_data_de     ,
    output  wire    [DW-1:0]    ave_data          
);

wire    [DW-1:0]      matrix11    ;
wire    [DW-1:0]      matrix12    ;
wire    [DW-1:0]      matrix13    ;
wire    [DW-1:0]      matrix21    ;
wire    [DW-1:0]      matrix22    ;
wire    [DW-1:0]      matrix23    ;
wire    [DW-1:0]      matrix31    ;
wire    [DW-1:0]      matrix32    ;
wire    [DW-1:0]      matrix33    ;    

padding_matrix #(
	.COL 	    (COL        ),
	.ROW 	    (ROW        ),
	.PADDING    (PADDING    )
)u_padding_matrix(
 	.clk 		    (clk 		    ),
 	.rst_n 		    (rst_n 		    ),

 	.data 		    (data 		    ),
 	.data_de 	    (data_de 	    ), 

 	.matrix_de 	    (matrix_de 	    ),
 	.matrix11 	    (matrix11 	    ),
 	.matrix12 	    (matrix12 	    ),
 	.matrix13 	    (matrix13 	    ),
 	.matrix21 	    (matrix21 	    ),
 	.matrix22 	    (matrix22 	    ),
 	.matrix23 	    (matrix23 	    ),
 	.matrix31 	    (matrix31 	    ),
 	.matrix32 	    (matrix32 	    ),
 	.matrix33 	    (matrix33 	    )
);

ave_filter #(
    .DW         (DW)
)u_ave_filter(
    .clk            (clk            ),
    .rst_n          (rst_n          ),

    .matrix_de      (matrix_de      ),
    .matrix11       (matrix11       ),
    .matrix12       (matrix12       ),
    .matrix13       (matrix13       ),
    .matrix21       (matrix21       ),
    .matrix22       (matrix22       ),
    .matrix23       (matrix23       ),
    .matrix31       (matrix31       ),
    .matrix32       (matrix32       ),
    .matrix33       (matrix33       ),

    .ave_data_de    (ave_data_de    ),
    .ave_data       (ave_data       )
    );
endmodule

在这里插入图片描述

3.2 FPGA仿真

3.2.1 像素读入

`timescale 1ns / 1ps

module img_gen
#(
 	parameter 	ACTIVE_IW 	= 	1920 	,
 	parameter 	ACTIVE_IH 	= 	1080 	,
 	parameter 	TOTAL_IW 	= 	2200 	,
 	parameter 	TOTAL_IH 	= 	1100 	,
 	parameter 	H_START 	= 	100 	,
 	parameter 	V_START 	= 	4 		 		
)(
	input 	wire 				clk 	,
	input 	wire 				rst_n 	,
	output 	reg 				vs 		,
	output 	reg  	 	 		de 		,
	output 	reg 	[7:0] 		data 	
);

reg  	[7:0] 	raw_array 	 [ACTIVE_IW*ACTIVE_IH-1:0];

integer i;
initial begin
	for (i=0 ;i<ACTIVE_IH*ACTIVE_IW ; i=i+1) begin
		raw_array[i] = 0;
	end
end

initial begin
	$readmemh("H:/picture/Z7/lesson7/data/pre.txt",raw_array);
end

reg 	[15:0] 	hcnt 	;
reg 	[15:0] 	vcnt 	;

reg 			h_de 	;
reg 			v_de  	;

reg  			index_de 	;
reg 	[31:0] 	index 	 	;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		hcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1)
		hcnt <= 'd0;
	else 
		hcnt <= hcnt + 1'b1;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		vcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1 && vcnt == TOTAL_IH - 1)
		vcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1)
		vcnt <= vcnt + 1'b1;
	else 
		vcnt <= vcnt;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		vs <= 'd0;
	else if(vcnt>=2)
		vs <= 1'b1;
	else 
		vs <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		h_de <= 'd0;
	else if(hcnt >= H_START && hcnt < H_START + ACTIVE_IW)
		h_de <= 1'b1;
	else 
		h_de <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		v_de <= 'd0;
	else if(vcnt >= V_START && vcnt < V_START + ACTIVE_IH)
		v_de <= 1'b1;
	else 
		v_de <= 1'b0;


always @(posedge clk or negedge rst_n)
	if(!rst_n)
		index_de <= 'd0;
	else if(h_de == 1'b1 && v_de == 1'b1)
		index_de <= 1'b1;
	else 
		index_de <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		index <= 'd0;
	else if(index == ACTIVE_IW * ACTIVE_IH-1)
		index <= 0;
	else if(index_de == 1'b1)
		index <= index + 1;
	else 
		index <= index;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		de <= 'd0;
	else 
		de <= index_de;

always @(posedge clk or negedge rst_n)begin
	if(index_de == 1'b1)
		data 	<= 	raw_array[index];
	else 
		data 	<= 0;
end
endmodule

3.2.1 顶层TB连接

`timescale 1ns / 1ps

module img_gen
#(
 	parameter 	ACTIVE_IW 	= 	1920 	,
 	parameter 	ACTIVE_IH 	= 	1080 	,
 	parameter 	TOTAL_IW 	= 	2200 	,
 	parameter 	TOTAL_IH 	= 	1100 	,
 	parameter 	H_START 	= 	100 	,
 	parameter 	V_START 	= 	4 		 		
)(
	input 	wire 				clk 	,
	input 	wire 				rst_n 	,
	output 	reg 				vs 		,
	output 	reg  	 	 		de 		,
	output 	reg 	[7:0] 		data 	
);

reg  	[7:0] 	raw_array 	 [ACTIVE_IW*ACTIVE_IH-1:0];

integer i;
initial begin
	for (i=0 ;i<ACTIVE_IH*ACTIVE_IW ; i=i+1) begin
		raw_array[i] = 0;
	end
end

initial begin
	$readmemh("H:/picture/Z7/lesson7/data/pre.txt",raw_array);
end

reg 	[15:0] 	hcnt 	;
reg 	[15:0] 	vcnt 	;

reg 			h_de 	;
reg 			v_de  	;

reg  			index_de 	;
reg 	[31:0] 	index 	 	;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		hcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1)
		hcnt <= 'd0;
	else 
		hcnt <= hcnt + 1'b1;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		vcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1 && vcnt == TOTAL_IH - 1)
		vcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1)
		vcnt <= vcnt + 1'b1;
	else 
		vcnt <= vcnt;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		vs <= 'd0;
	else if(vcnt>=2)
		vs <= 1'b1;
	else 
		vs <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		h_de <= 'd0;
	else if(hcnt >= H_START && hcnt < H_START + ACTIVE_IW)
		h_de <= 1'b1;
	else 
		h_de <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		v_de <= 'd0;
	else if(vcnt >= V_START && vcnt < V_START + ACTIVE_IH)
		v_de <= 1'b1;
	else 
		v_de <= 1'b0;


always @(posedge clk or negedge rst_n)
	if(!rst_n)
		index_de <= 'd0;
	else if(h_de == 1'b1 && v_de == 1'b1)
		index_de <= 1'b1;
	else 
		index_de <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		index <= 'd0;
	else if(index == ACTIVE_IW * ACTIVE_IH-1)
		index <= 0;
	else if(index_de == 1'b1)
		index <= index + 1;
	else 
		index <= index;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		de <= 'd0;
	else 
		de <= index_de;

always @(posedge clk or negedge rst_n)begin
	if(index_de == 1'b1)
		data 	<= 	raw_array[index];
	else 
		data 	<= 0;
end
endmodule

4 MATLAB实现与比较

4.1 MATLAB实现

clc;
clear all;
GRAY = imread('../img/gray.bmp');
[row,col] = size(GRAY);
GRAY = double(GRAY);
ave_padding = zeros(row+2,col+2);
ave_result  =   zeros(row,col);
for i = 1:row
    for j = 1:col
        ave_padding(i+1,j+1) = GRAY(i,j);
    end
end

for i = 1:row+2
    ave_padding(i,1) = ave_padding(i,2);
    ave_padding(i,col+2) = ave_padding(i,col+1);
end

for i = 1:col+2
   ave_padding(1,i) = ave_padding(2,i);
   ave_padding(row+2,i) = ave_padding(row+1,i);
end

for i = 2:row+1
    for j = 2:col+1
        matrix11 = ave_padding(i-1,j-1);
        matrix12 = ave_padding(i-1,j);
        matrix13 = ave_padding(i-1,j+1);
        
        matrix21 = ave_padding(i,j-1);
        matrix22 = ave_padding(i,j);
        matrix23 = ave_padding(i,j+1);
        
        matrix31 = ave_padding(i+1,j-1);
        matrix32 = ave_padding(i+1,j);
        matrix33 = ave_padding(i+1,j+1); 
        
        ave_result(i-1,j-1) = (matrix11+matrix12+matrix13+matrix21+matrix22+matrix23+matrix31+matrix32+matrix33)/9;
    end
end
matlab_Y = uint8(floor(ave_result));

a = textread('../data/post.txt','%s');
IMdec = hex2dec(a);

col = 1920;
row = 1080;

IM = reshape(IMdec,col,row);
fpga_Y = uint8(IM)';

subplot(1,2,1)
imshow(matlab_Y),title('MATLAB算法图像');
subplot(1,2,2)
imshow(fpga_Y),title('FPGA算法图像');

sub = matlab_Y - fpga_Y;

min_sub = min(min(sub));
max_sub = max(max(sub));

4.2 比较

4.2.1 数据比较

在这里插入图片描述
  两者实现像素做差可以看出FPGA实现与MATLAB实现在部分像素区域有着一个像素点的误差,这在定浮点数中无可避免。

4.2.2 算法结果比较

在这里插入图片描述

4.2.3算法前后比较

  将FPGA仿真得到的post.txt图像数据转化为BMP格式的图片并显示出来。转化代码为:

clear ;
clc ;
close;
a = textread("../data/post.txt",'%s');
IMdec = hex2dec(a);

col = 1920;
row = 1080;

IM = reshape(IMdec,col,row);
b = uint8(IM)';
imwrite(b,'../img/post.bmp');
subplot(1,2,1)
imshow('../img/post.bmp'),title('FPGA算法图像');
subplot(1,2,2)
imshow('../img/gray.bmp'),title('原图像');

  得到的图像对比如下图,可以看出边缘明显变模糊,这也是均值滤波的缺点,所以一般情况下不会用均值滤波来做图像处理,一般采用中值滤波等。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1560251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM实战之性能调优[2](线程转储案例认识和分析)

文章目录 版权声明案例1&#xff1a;CPU占用率高问题问题描述解决思路补充内容 案例2&#xff1a;接口响应时间长问题问题描述解决思路Arthas trace命令Arthas watch命令解决问题 案例3&#xff1a;定位偏底层性能问题问题描述解决思路&#xff1a;Arthas火焰图问题解决 案例4&…

高级DBA带你处理MySQL客户端程序频繁访问MYSQL数据库并错误链接不释放导致连接数爆满事故实战

高级DBA带你处理MySQL客户端程序频繁访问MYSQL数据库并错误链接不释放导致连接数爆满事故实战 一、生产事故描述 Mysql生产数据库最大连接数爆满&#xff0c;其余客户端也同样拿不到数据库连接&#xff0c;生产异常&#xff0c;数据传输失败&#xff01; 报错如下&#xff1a…

有趣的css - 文字下划线条动画按钮

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用 css 实现文字下划线条动画按钮。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页…

【WEEK5】 【DAY5】DML语言【中文版】

2024.3.29 Friday 目录 3.DML语言3.1.外键&#xff08;了解&#xff09;3.1.1.概念3.1.2.作用3.1.3.添加&#xff08;书写&#xff09;外键的几种方法3.1.3.1.创建表时直接在主动引用的表里写&#xff08;被引用的表的被引用的部分&#xff09;3.1.3.2.先创建表后修改表以添加…

近年来,常见5大软件开发项目管理工具

时代进步&#xff0c;技术进步&#xff0c;汇总下近几年5大常用的软件开发项目管理工具。 1、微软项目管理软件 Microsoft Project&#xff08;或MSP&#xff09;是由微软开发销售的项目管理软件程序。软件设计目的在于协助项目经理制定发展计划、为任务分配资源、跟踪进度、管…

目标检测——门牌号数据集

一、重要性及意义 识别自然场景图像中的数字和号码具有极高的重要性和意义&#xff0c;这主要体现在以下几个方面&#xff1a; 实际应用广泛性&#xff1a;自然场景中的数字和号码识别技术在日常生活中有着广泛的应用。例如&#xff0c;在自动驾驶车辆中&#xff0c;准确识别路…

【网站项目】面向社区健康服务的医疗平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【动手学深度学习】深入浅出深度学习之利用神经网络识别螺旋状数据集

目录 &#x1f31e;一、实验目的 &#x1f31e;二、实验准备 &#x1f31e;三、实验内容 &#x1f33c;1. 生成螺旋状数据集 &#x1f33c;2. 打印数据集 &#x1f33c;3. 编程实现 &#x1f33b;仿射层-Affine类 &#x1f33b;传播层-Sigmoid类 &#x1f33b;损失函数…

SSH连接SFTP传输:如何使用libssh库在windows环境下进行(文件、文件夹)传输到远端服务器

配置环境cmake编译libssh如何使用生成的dll与lib文件配置lib 方法一配置lib 方法二配置dll方法一 将dll配置进入环境变量配置dll方法二 在编译过后将dll直接与可执行文件.exe文件放在同一目录下传输文件、文件夹代码&#xff08;适配windows&#xff09; 由于windows上的编译器…

C语言 | Leetcode C语言题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {struct ListNode *head NULL, *tail NULL;int carry 0;while (l1 || l2) {int n1 l1 ? l1->val : 0;int n2 l2 ? l2->val : 0;int sum n1 n2 …

使用 Spring Email 和 Thymeleaf 技术,向新注册用户发送激活邮件(一)

这篇内容对应"2.1 发送邮件"小节 对应视频&#xff1a;9-发送邮件 视频链接 邮箱设置 需要去邮箱对应的官方客户端软件或网站开启IMAP/SMTP服务或POP3/SMTP服务器 如果不开启&#xff0c;就无法使用第三方用户代理&#xff0c;只能走第官方的电子邮件客户端软件或…

GT收发器第一篇_总体结构介绍

文章目录 前言GT收发器介绍 前言 之前写过一篇简单介绍GT的文章https://blog.csdn.net/m0_56222647/article/details/136730026&#xff0c;可以先通过这篇文章对整体进行简单了解一下。 GT收发器介绍 参考xilinx手册ug476 对于7系列的FPGA&#xff0c;共有3个系列&#xf…

3D检测:从pointnet,voxelnet,pointpillar到centerpoint

记录centerpoint学习笔记。目前被引用1275次&#xff0c;非常高。 地址&#xff1a;Center-Based 3D Object Detection and Tracking (thecvf.com) GitHub - tianweiy/CenterPoint CenterPoint&#xff1a;三维点云目标检测算法梳理及最新进展&#xff08;CVPR2021&#xff…

【Java初阶(七)】接口

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; 目录 1.前言2.接口2.1语法规则2.2接口使用2.3接口特性2.4实现多个接口2.5接口使用实例2.6Clonable接口和深拷贝 3.Object类3.1对象比较equals方法3.2hashcod…

Vivado使用(1)——综合的约束与策略

目录 一、概述 二、约束与策略 2.1 约束 2.1.1 物理约束 2.1.2 时序约束 2.2 综合策略 2.2.1 flatten_hierarchy 2.2.2 gated_clock_conversion 2.2.3 bufg 2.2.4 fanout_limit 2.2.5 directive 2.2.6 retiming 2.2.7 fsm_extraction 2.2.8 keep_equivalent_regi…

Uibot6.0 (RPA财务机器人师资培训第6天 )发票验真机器人案例实战

类似于小北的这篇博客&#xff1a;Uibot (RPA设计软件&#xff09;Mage AI智能识别&#xff08;发票识别&#xff09;———课前材料五_uibot 添加mageai-CSDN博客https://blog.csdn.net/Zhiyilang/article/details/135591297?spm1001.2014.3001.5501训练网站&#xff1a;泓江…

嵌入式科普(14)指针---这些年嵌入式工程师也不容易理解的词语

目录 一、指针&#xff08;Pointer&#xff09;&#xff1a; 1.1 动态内存管理&#xff1a; 1.2 数组和字符串操作&#xff1a; 1.3 函数参数传递&#xff1a; 1.4 数据结构实现&#xff08;链表&#xff09;&#xff1a; 1.5 实现回调函数&#xff1a; 1.6 提高性能&am…

Day63-LVS四层负载均衡及结合Nginx7层负载均衡实践

Day63-LVS四层负载均衡及结合Nginx7层负载均衡实践 1. LVS&#xff08;Linux Virtual Server&#xff09;介绍2. IPVS&#xff08;LVS&#xff09;发展史3. IPVS软件工作层次图4. LVS技术点小结5. LVS的4模式原理讲解5.1 NAT(Network AddressTranslation)&#xff0c;中文网络地…

纽扣电池CR1632没有电解决方案

使用环境 在使用小米的自拍杆时&#xff0c;发现纽扣电池没有电量了逛了下超市&#xff0c;结果发现都没有卖这个型号的电池&#xff0c;但是下午又要拍照&#xff0c;于是想起了应急的充电方法。声明一下&#xff0c;这个内置电池型号是CR1632&#xff0c;然而市面上&#xff…

vue基础教程(5)——十分钟吃透vue路由router

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、路由概念二、路由使用三、创建路由对应的组件四、给整个项目一个入口总结 前言 前面的文章运行成功后&#xff0c;页面显示如下&#xff1a; 在这个页面中&#xff0c;点击Home和About都会切换右面的页面内容&#…