二、FPGA实时图像处理(灰度转换、高斯滤波、二值化和边缘检测)

这篇具有很好参考价值的文章主要介绍了二、FPGA实时图像处理(灰度转换、高斯滤波、二值化和边缘检测)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、框图

①:整体框图

基于图像实时采集系统实现图像处理
二、FPGA实时图像处理(灰度转换、高斯滤波、二值化和边缘检测)

②:图像处理模块框图

二、FPGA实时图像处理(灰度转换、高斯滤波、二值化和边缘检测)

2、灰度转换模块

算法:采用精度为7的心理学公式:Gray = R0.299 + G0.587 + B0.114, Gray = R38 + G75 + B15 >> 7

/**************************************功能介绍***********************************
Copyright:			
Date     :			
Author   :厉长川			
Version  :2022.10.12 v1			
Description:灰度转换模块
心理学公式:Gray = R*0.299 + G*0.587 + B*0.114, Gray = R*38 + G*75 + B*15 >> 7
*********************************************************************************/

module rgb2gray( 
    input				clk		  ,//pclk
    input				rst_n	  ,//复位信号
    input               rgb_valid ,//rgb数据有效标志
    input		[15:0]	rgb_din   ,//rgb数据输入

    output		[7:0]	gray_dout ,//灰度转换输出
    output	         	gray_valid //灰度转换数据有效标志
);								                  
    //中间信号定义		 
    wire	    [7:0]	r         ;//rgb888
    wire	    [7:0]	g         ;//rgb888
    wire        [7:0]   b         ;//rgb888
    reg         [2:0]   valid_r   ;//rgb数据有效标志打拍
    reg         [14:0]  r_u       ;//灰度转换运算寄存
    reg         [14:0]  g_u       ;//灰度转换运算寄存
    reg         [14:0]  b_u       ;//灰度转换运算寄存
    reg         [14:0]  u_out     ;//运算和寄存

    //RGB565转RGB888:采用量化补偿的方式
    assign r = {rgb_din[15:11], rgb_din[13:11]};
    assign g = {rgb_din[10:5], rgb_din[6:5]};
    assign b = {rgb_din[4:0], rgb_din[2:0]};

    //valid_r:rgb数据有效标志打拍
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            valid_r <= 2'b0;
        end 
        else begin 
            valid_r <= {valid_r[1:0], rgb_valid};
        end 
    end

    //7位精度的灰度转换运算
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            r_u <= 15'b0; 
            g_u <= 15'b0; 
            b_u <= 15'b0;
        end 
        else if(valid_r[0])begin 
            r_u <= r*7'd38; 
            g_u <= g*7'd75; 
            b_u <= b*7'd15;
        end 
    end

    //u_out:运算和
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            u_out <= 15'b0;
        end 
        else if(valid_r[1])begin 
            u_out <= r_u + g_u + b_u;
        end 
    end

    //gray_dout:灰度转换结果
    assign gray_dout = u_out[7 +:8];

    //gray_valid:灰度转换完成标志
    assign gray_valid = valid_r[2];
                        
endmodule

3、高斯滤波模块

/**************************************功能介绍***********************************
Copyright:			
Date     :			
Author   :厉长川			
Version  :2022.10.13 v1			
Description:高斯滤波模块		
           1 2 1
w = 1/16 * 2 4 2
           1 2 1
*********************************************************************************/

module gus_filter( 
    input				clk		  ,
    input				rst_n	  ,
    input		[7:0]   gray_din  ,
    input		        gray_valid,

    output	reg	[7:0]	gus_dout  ,
    output		        gus_valid	
);			
    //中间信号定义
    wire        [7:0]   taps0     ;//shift输出数据
    wire        [7:0]   taps1     ;//shift输出数据
    wire        [7:0]   taps2     ;//shift输出数据
    reg         [7:0]   taps0_1   ;//第一拍数据
    reg         [7:0]   taps1_1   ;//第一拍数据
    reg         [7:0]   taps2_1   ;//第一拍数据
    reg         [7:0]   taps0_2   ;//第二拍数据
    reg         [7:0]   taps1_2   ;//第二拍数据
    reg         [7:0]   taps2_2   ;//第二拍数据
    reg         [10:0]  sum_1     ;//第一行加权和
    reg         [11:0]  sum_2     ;//第二行加权和
    reg         [10:0]  sum_3     ;//第三行加权和
    reg         [3:0]   valid_r   ;//输入数据有效标志打四拍

    //valid_r:输入数据有效标志打四拍
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            valid_r <= 4'b0;
        end 
        else begin 
            valid_r <= {valid_r[2:0], gray_valid};
        end 
    end

    //shift输出数据打拍
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            taps0_1 <= 8'b0; 
            taps1_1 <= 8'b0;
            taps2_1 <= 8'b0;
            taps0_2 <= 8'b0;
            taps1_2 <= 8'b0;
            taps2_2 <= 8'b0;
        end 
        else begin 
            taps0_1 <= taps0; 
            taps1_1 <= taps1;
            taps2_1 <= taps2;
            taps0_2 <= taps0_1;
            taps1_2 <= taps1_1;
            taps2_2 <= taps2_1;
        end 
    end

    //三行数据加权和计算
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            sum_1 <= 11'b0;
            sum_2 <= 12'b0;
            sum_3 <= 11'b0;
        end 
        else if(valid_r[1])begin 
            sum_1 <= taps0 + {taps0_1,1'b1} + taps0_2;
            sum_2 <= {taps1,1'b1} + {taps1_1,2'b11} + {taps1_2,1'b1};
            sum_3 <= taps2 + {taps2_1,1'b1} + taps2_2;
        end 
    end

    //最后结果输出
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            gus_dout <= 8'b0;
        end 
        else if(valid_r[2])begin 
            gus_dout <= (sum_1 + sum_2 + sum_3) >> 3'd4;
        end 
    end

    //高斯滤波数据有效标志
    assign gus_valid = valid_r[3];

    shift_gus	shift_gus_inst (
        .clken    (gray_valid),
        .clock    (clk       ),
        .shiftin  (gray_din  ),
        .shiftout (          ),
        .taps0x   (taps0     ),
        .taps1x   (taps1     ),
        .taps2x   (taps2     )
    );
                        
endmodule

4、二值化模块

/**************************************功能介绍***********************************
Copyright:			
Date     :			
Author   :厉长川			
Version  :2022.10.14 v2	简化算法
          2022.10.13 v1			
Description:二值化模块		
*********************************************************************************/

`include "param.v"

module bin( 
    input				clk		  ,//pclk
    input				rst_n	  ,//复位信号
    input		[7:0]	gus_din	  ,//高斯滤波输入
    input		        gus_valid ,//高斯滤波输入有效标志

    output	     	    bin_dout  ,//二值化输出
    output	        	bin_valid  //二值化输出有效标志
);		

    //bin_dout:二值化输出
    assign bin_dout = (gus_din > `BIN)?1'b1:1'b0;

    //bin_valid:二值化输出有效标志
    assign bin_valid = gus_valid;
                        
endmodule

5、边缘检测模块

采用sobel算子进行边缘检测。

/**************************************功能介绍***********************************
Copyright:			
Date     :			
Author   :厉长川			
Version  :2022.10.13 v1			
Description:边缘检测模块
     -1 0 +1      +1 +2 +1
Gx = -2 0 +2 Gy =  0  0  0
     -1 0 +1      -1 -2 -1
G = |Gx| + |Gy|;
*********************************************************************************/

`include "param.v"

module sobel( 
    input				clk		    ,//pclk
    input				rst_n	    ,//复位信号
    input				bin_din	    ,//二值化输入
    input	            bin_valid   ,//二值化输入有效标志

    output			    sobel_dout	,//边缘检测输出
    output		     	sobel_valid	 //边缘检测输出有效标志
);								 		                       
    //中间信号定义
    wire                taps0       ;//shift输出数据
    wire                taps1       ;//shift输出数据
    wire                taps2       ;//shift输出数据
    reg                 taps0_1     ;//第一拍数据
    reg                 taps1_1     ;//第一拍数据
    reg                 taps2_1     ;//第一拍数据
    reg                 taps0_2     ;//第二拍数据
    reg                 taps1_2     ;//第二拍数据
    reg                 taps2_2     ;//第二拍数据
    reg         [2:0]   sumx_1      ;//x方向第一列
    reg         [2:0]   sumx_3      ;//x方向第三列
    reg         [2:0]   sumy_1      ;//y方向第一行
    reg         [2:0]   sumy_3      ;//y方向第三行
    reg         [2:0]   g_x         ;//x方向梯度
    reg         [2:0]   g_y         ;//y方向梯度
    reg         [3:0]   g           ;//总梯度和
    reg         [4:0]   valid_r     ;//输入数据有效标志打四拍

    //valid_r:输入数据有效标志打四拍
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            valid_r <= 5'b0;
        end 
        else begin 
            valid_r <= {valid_r[3:0], bin_valid};
        end 
    end

    //shift输出数据打拍
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            taps0_1 <= 1'b0; 
            taps1_1 <= 1'b0;
            taps2_1 <= 1'b0;
            taps0_2 <= 1'b0;
            taps1_2 <= 1'b0;
            taps2_2 <= 1'b0;
        end 
        else begin 
            taps0_1 <= taps0  ; 
            taps1_1 <= taps1  ;
            taps2_1 <= taps2  ;
            taps0_2 <= taps0_1;
            taps1_2 <= taps1_1;
            taps2_2 <= taps2_1;
        end 
    end

    //加权和
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            sumx_1 <= 3'b0;
            sumx_3 <= 3'b0;
            sumy_1 <= 3'b0;
            sumy_3 <= 3'b0;
        end 
        else if(valid_r[1])begin 
            sumx_1 <= taps0 + {taps1  ,1'b1} + taps2;
            sumx_3 <= taps0_2 + {taps1_2,1'b1} + taps2_2;
            sumy_1 <= taps0 + {taps0_1,1'b1} + taps0_2;
            sumy_3 <= taps2 + {taps2_1,1'b1} + taps2_2;
        end 
    end

    //x和y方向梯度
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            g_x <= 3'b0;
            g_y <= 3'b0;
        end 
        else if(valid_r[2])begin 
            g_x <= (sumx_1 > sumx_3)?sumx_1 - sumx_3:sumx_3 - sumx_1;
            g_y <= (sumy_1 > sumy_3)?sumy_1 - sumy_3:sumy_3 - sumy_1;
        end 
    end

    //g:总梯度和
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            g <= 4'b0;
        end 
        else if(valid_r[3])begin 
            g <= g_x + g_y;
        end 
    end

    //边缘检测结果
    assign sobel_dout = (g > `SOBEL)?1'b1:1'b0;

    //边缘检测数据有效标志
    assign sobel_valid = valid_r[4];

    shift_sobel	shift_sobel_inst (
        .clken    ( bin_valid ),
        .clock    ( clk       ),
        .shiftin  ( bin_din   ),
        .shiftout (           ),
        .taps0x   ( taps0     ),
        .taps1x   ( taps1     ),
        .taps2x   ( taps2     )
    );

endmodule

6、图像处理模块

/**************************************功能介绍***********************************
Copyright:			
Date     :			
Author   :厉长川			
Version  :2022.10.13 v1			
Description:图像数据处理模块		
*********************************************************************************/

`include "param.v"

module process( 
    input				clk		   ,//pclk
    input				rst_n	   ,//复位信号
    input		[15:0]	rgb_din    ,//rgb数据输入
    input		        rgb_valid  ,//rgb数据有效标志  

    output		[15:0]	pro_dout   ,//处理完成输出
    output		     	pro_valid   //处理完成输出有效标志
);		
    //中间信号定义						 			 
    wire        [7:0]   gray_dout  ;//灰度转换输出
    wire                gray_valid ;//灰度转换输出有效标志             		 
    wire        [7:0]   gus_dout   ;//高斯滤波输出
    wire                gus_valid  ;//高斯滤波输出有效标志
    wire                bin_dout   ;//二值化输出
    wire                bin_valid  ;//二值化输出有效标志
    wire                sobel_dout ;//边缘检测输出
    wire                sobel_valid;//边缘检测输出有效标志

    //灰度转换模块
    rgb2gray u_rgb2gray(
    	.clk         (clk         ),
        .rst_n       (rst_n       ),
        .rgb_valid   (rgb_valid   ),
        .rgb_din     (rgb_din     ),
        .gray_dout   (gray_dout   ),
        .gray_valid  (gray_valid  )
    );
    
    //高斯滤波模块
    gus_filter u_gus_filter(
    	.clk         (clk         ),
        .rst_n       (rst_n       ),
        .gray_din    (gray_dout   ),
        .gray_valid  (gray_valid  ),
        .gus_dout    (gus_dout    ),
        .gus_valid   (gus_valid   )
    );

    //二值化模块
    bin u_bin(
    	.clk         (clk         ),
        .rst_n       (rst_n       ),
        .gus_din     (gus_dout    ),
        .gus_valid   (gus_valid   ),
        .bin_dout    (bin_dout    ),
        .bin_valid   (bin_valid   )
    );
    
    //边缘检测模块
    sobel u_sobel(
    	.clk         (clk         ),
        .rst_n       (rst_n       ),
        .bin_din     (bin_dout    ),
        .bin_valid   (bin_valid   ),
        .sobel_dout  (sobel_dout  ),
        .sobel_valid (sobel_valid )
    );

    //输出控制
    `ifdef GRAY_OUT //输出灰度化图像
        assign pro_dout = {gray_dout[7:3], gray_dout[7:2], gray_dout[7:3]};//灰度输出
        assign pro_valid = gray_valid;//灰度输出有效标志
    `endif 
    
    `ifdef GUS_OUT  //输出高斯滤波图像
        assign pro_dout = {gus_dout[7:3], gus_dout[7:2], gus_dout[7:3]};//高斯滤波输出
        assign pro_valid = gus_valid;//高斯滤波输出有效标志
    `endif 

    `ifdef BIN_OUT  //输出二值化图像
        assign pro_dout = {16{bin_dout}};//二值化输出
        assign pro_valid = bin_valid;//二值化输出有效标志
    `endif 

    `ifdef SOBEL_OUT//输出边缘检测图像
        assign pro_dout = {16{sobel_dout}};//边缘检测输出
        assign pro_valid = sobel_valid;//边缘检测输出有效标志
    `endif 

    `ifdef NO_PRO   //输出rgb图像
        assign pro_dout = rgb_din;//rgb输出
        assign pro_valid = rgb_valid;//rgb输出有效标志
    `endif
                        
endmodule

7、顶层模块

/**************************************功能介绍***********************************
Copyright:			
Date     :			
Author   :厉长川			
Version  :2022.10.10 v1			
Description:顶层模块		
*********************************************************************************/

module img_pro( 
    input				clk		    ,//系统时钟50Mhz
    input				rst_n	    ,//复位信号,低电平有效
    input   [7:0]       cmos_db     ,//摄像头采集数据
    input               cmos_pclk   ,//摄像头pclk时钟48MHz
    input               cmos_vsync  ,//摄像头场同步信号
    input               cmos_href   ,//摄像头行有效信号

    output              cmos_rst_n  ,//摄像头复位信号
    output              cmos_xclk   ,//摄像头xclk时钟24Mhz
    output              cmos_pwdn   ,//摄像头掉电使能信号
    output		    	cmos_scl	,//摄像头配置时钟信号
    inout		    	cmos_sda	,//摄像头配置数据信号
    output              sdram_clk   ,//sdram工作时钟
    output              sdram_cke   ,//sdram使能
    output  [12:0]      sdram_addr  ,//sdram地址总线
    output  [1:0]       sdram_ba    ,//sdram bank地址
    inout   [15:0]      sdram_dq    ,//sdram数据总线
    output  [1:0]       sdram_dqm   ,//数据掩码
    output  [3:0]       cmd         ,//sdram操作命令
    output              vga_out_hs  ,//vga行同步信号
    output              vga_out_vs  ,//vga场同步信号
    output  [15:0]      vga_dout     //vga输出的RGB数据

);								                 
    //中间信号定义		 
    wire                vga_clk     ;//vga时钟
    wire                clk_100MHz  ;//100MHz工作时钟
    wire                done        ;//摄像头配置完成标志
    wire    [15:0]      pixel_dout  ;//采集的像素数据
    wire                dout_valid  ;//采集数据有效标志
    wire    [15:0]      w_data      ;//sdram写入数据
    wire    [15:0]      r_data      ;//sdram读出数据
    wire    [15:0]      vga_din     ;//vga输入数据
    wire                data_req    ;//vga数据请求
    wire    [23:0]      w_addr      ;//sdram写地址
    wire    [23:0]      r_addr      ;//sdram读地址
    wire                sdram_rdreq ;//sdram数据接收fifo,读请求
    wire                sdram_wrreq ;//sdram数据发送fifo,写请求
    wire                r_ack       ;//读响应
    wire                wr_ack      ;//写响应
    wire                locked_1    ;//pll_1输出稳定标志
    wire                locked_2    ;//pll_2输出稳定标志
    wire                reset       ;//sccb、data_cache、sdram和vga模块复位信号
    wire                init_done   ;//sdram初始化结束
    wire                pixel_rst   ;//pixel_sampling模块复位信号
    wire                w_done      ;//写完成标志
    wire                r_done      ;//读完成标志
    wire                pro_valid   ;//灰度转换数据有效标志
    wire   [15:0]       pro_dout    ;//灰度转换输出
    wire                pclk        ;//增强后的cmos_pclk

    //sdram_cke:sdram使能
    assign sdram_cke = 1'b1;

    //sdram_dqm:数据掩码
    assign sdram_dqm = 2'b00;

    //reset:sccb、data_cache、sdram和vga模块复位信号
    assign reset = locked_1 & locked_2 & rst_n;

    //pixel_rst:pixel_sampling模块复位信号
    assign pixel_rst = done & init_done & reset;

    //时钟增强模块例化
    iobuf	iobuf_inst (
        .datain       ( cmos_pclk    ),
        .dataout      ( pclk         )
	);
 
    //摄像头配置模块例化
    sccb u_sccb(
    	.clk          (clk           ),
        .rst_n        (reset         ),
        .done         (done          ),
        .cmos_rst_n   (cmos_rst_n    ),
        .cmos_pwdn    (cmos_pwdn     ),
        .cmos_scl     (cmos_scl      ),
        .cmos_sda     (cmos_sda      )
    );
    
    //摄像头数据拼接模块例化
    pixel_sampling u_pixel_sampling(
    	.clk          (pclk          ),//摄像头pclk时钟48MHz
        .rst_n        (pixel_rst     ),//pixel_sampling模块复位信号
        .din          (cmos_db       ),//摄像头采集数据
        .vsync        (cmos_vsync    ),//摄像头场同步信号
        .href         (cmos_href     ),//摄像头行有效信号
        .dout_valid   (dout_valid    ),//输出数据有效标志
        .dout         (pixel_dout    ) //输出拼接完成的像素
    );

    //图像数据处理模块例化
    process u_process(
    	.clk          (pclk          ),
        .rst_n        (pixel_rst     ),
        .rgb_din      (pixel_dout    ),
        .rgb_valid    (dout_valid    ),
        .pro_dout     (pro_dout      ),
        .pro_valid    (pro_valid     )
    );
    
    //数据缓存模块例化
    data_cache u_data_cache(
    	.clk          (clk_100MHz    ),
        .rst_n        (reset         ),
        .w_done       (w_done        ),
        .r_done       (r_done        ),
        .init_done    (init_done     ),
        .r_data       (pro_dout      ),
        .r_wrclk      (pclk          ),
        .r_wrreq      (pro_valid     ),
        .t_data       (r_data        ),
        .t_rdclk      (vga_clk       ),
        .t_rdreq      (data_req      ),
        .w_ack        (wr_ack        ),
        .r_ack        (r_ack         ),
        .r_q          (w_data        ),
        .w_addr       (w_addr        ),
        .r_addr       (r_addr        ),
        .t_q          (vga_din       ),
        .sdram_rdreq  (sdram_rdreq   ),//sdram数据接收fifo,读请求
        .sdram_wrreq  (sdram_wrreq   ) //sdram数据发送fifo,写请求
    );
    
    //sdram操作模块例化
    sdram u_sdram(
    	.clk          (clk_100MHz    ),
        .rst_n        (reset         ),
        .w_req        (sdram_wrreq   ),
        .r_req        (sdram_rdreq   ),
        .w_addr       (w_addr        ),
        .r_addr       (r_addr        ),
        .w_data       (w_data        ),
        .r_data       (r_data        ),
        .sdram_addr   (sdram_addr    ),
        .sdram_ba     (sdram_ba      ),
        .sdram_dq     (sdram_dq      ),
        .cmd          (cmd           ),
        .init_done    (init_done     ),
        .r_ack        (r_ack         ),
        .wr_ack       (wr_ack        ),
        .w_done       (w_done        ),//写操作完成标志
        .r_done       (r_done        ) //读操作完成标志
    );

    //vga驱动模块例化
    vga u_vga(
    	.clk          (vga_clk       ),
        .rst_n        (reset         ),
        .din          (vga_din       ),
        .vga_out_hs   (vga_out_hs    ),
        .vga_out_vs   (vga_out_vs    ),
        .vga_dout     (vga_dout      ),
        .data_req     (data_req      )
    );
     
    //时钟模块1例化
    pll_1	pll_1_inst (
        .areset       (~rst_n        ),
        .inclk0       (clk           ),//50MHz
        .c0           (vga_clk       ),//65MHz
        .c1           (clk_100MHz    ),//100MHz
        .c2           (sdram_clk     ),//100MHz,-75deg
        .locked       (locked_1      )
	);

    //时钟模块2例化
    pll_2	pll_2_inst (
        .areset       (~rst_n        ),
        .inclk0       (clk           ),//50MHz系统时钟
        .c0           (cmos_xclk     ),//24Mhz
        .locked       (locked_2      )
	);
                        
endmodule

8、参数定义

可以通过参数定义修改二值化和边缘检测阈值,以及控制是否进行图像处理和图像处理类型选择。

/**************************************功能介绍***********************************
Copyright:			
Date     :			
Author   :厉长川			
Version  :2022.10.10 v1			
Description:参数定义		
*********************************************************************************/

//sccb参数定义
`define     CNT_1M      6'd50                                   //1M时钟计数
`define     CNT_MS      21'd1315000                             //26.3ms时间计数
`define     PWDN        18'd255000                              //5.1ms计时
`define     RST_CMOS    19'd310000                              //1.1ms复位等待时间
`define     NUM_CFG     8'd248                                  //寄存器配置个数
		
//pixel_sampling参数定义		
`define     PIXEL       4'd10                                   //舍弃帧数

//vga接口参数		
// 1024*768  65Mhz
`define     H_ACTIVE    11'd1024                                //行有效 
`define     H_FP        11'd24                                  //行前沿   
`define     H_SYNC      11'd136                                 //行同步
`define     H_BP        11'd160                                 //行后沿  
`define     H_TO        11'd1344                                //行周期
`define     V_ACTIVE    11'd768                                 //场有效  
`define     V_FP        11'd3                                   //场前沿    
`define     V_SYNC      11'd6                                   //场同步 
`define     V_BP        11'd29                                  //场后沿  
`define     V_TO        11'd806                                 //场周期 
	
//sdram模块参数		
`define     CMD_NOOP    4'b0111                                 //空指令
`define     CMD_ACT     4'b0011                                 //行激活指令
`define     CMD_RD      4'b0101                                 //读指令
`define     CMD_WR      4'b0100                                 //写指令
`define     CMD_BR      4'b0110                                 //突发终止指令
`define     CMD_PRE	    4'b0010                                 //预充电指令
`define     CMD_AREF	4'b0001                                 //自动刷新指令
`define     CMD_MOD     4'b0000                                 //模式寄存器配置命令
`define     INIT_TIME   14'd10000                               //上电等待时间,10000个时钟周期(100us)
`define     AREF_TIME   10'd700                                 //自动刷新间隔时间,700个时钟周期(7us)
`define     BURST_LEN   10'd512                                 //读写突发长度
`define     ADDR_END    `H_ACTIVE * `V_ACTIVE - `BURST_LEN      //读写地址末地址

//阈值参数
`define     BIN         7'd127                                  //二值化阈值
`define     SOBEL       2'd3                                    //边缘检测阈值

//图像处理控制参数
// `define     GRAY_OUT                                            //输出灰度化图像  
// `define     GUS_OUT                                             //输出高斯滤波图像     
// `define     BIN_OUT                                             //输出二值化图像   
// `define     SOBEL_OUT                                           //输出边缘检测图像    
`define     NO_PRO                                              //输出rgb图像

9、最终效果

高斯滤波效果不明显不做演示。

①:灰度转换

二、FPGA实时图像处理(灰度转换、高斯滤波、二值化和边缘检测)

②:二值化

二、FPGA实时图像处理(灰度转换、高斯滤波、二值化和边缘检测)

③:边缘检测

二、FPGA实时图像处理(灰度转换、高斯滤波、二值化和边缘检测)
二、FPGA实时图像处理(灰度转换、高斯滤波、二值化和边缘检测)文章来源地址https://www.toymoban.com/news/detail-509863.html

到了这里,关于二、FPGA实时图像处理(灰度转换、高斯滤波、二值化和边缘检测)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Matlab图像处理(1)彩色图像转换为灰度图像(初学必看)

    手把手教你用Matlab实现彩色图像转换为灰度图像 这是一个最基本将彩色图像转换为灰度图像的代码,接下来详细解释代码: ‘RGB’是自己设置的,可以换成另外任何字母可以是a,也可以是b ‘imread’是matlab自带的函数,意思是将后面的对象读入工作区,是必不可少的一步

    2024年02月05日
    浏览(45)
  • 基于fpga的图像处理之图像灰度化处理(Vivado+Modelsim+Matlab联合仿真验证)

    微信公众号上线,搜索公众号 小灰灰的FPGA ,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 源码工程链接 https://download.csdn.net/download/m0_50111463/88529260

    2024年02月10日
    浏览(60)
  • 图像处理之图像灰度化

    图像灰度化 彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万 (255 255 255)的颜色的变化范用。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像(R=G=B),其一个像素点的变化范围为255种,所以在数字图像处理

    2024年02月15日
    浏览(41)
  • OpenCV图像处理-灰度处理

    灰度的线性变换将图像中的所有像素点的值按 线性变换函数 进行变换。 在曝光不足或过度的情况下,图像的灰度值会局限在一个很小的范围内,这时在显示器上看到的将是一个模糊不清、似乎没有层次的图像。 针对这一情况,使用一个线性单值函数对图像内的每一个像素做

    2024年02月08日
    浏览(106)
  • 计算机视觉学习笔记(图像的灰度与灰度级 图像的深度 图像噪声 图像处理)

    如果把白色和黑色之间按对数关系分为若干等级,称为灰度,灰度分为256阶,0为黑色,灰度就是没有色彩,RGB色彩分量全部相等(150,150,150)就代表灰度为150. 一幅图像中不同位置的亮度是不一样的,可用f(x,y)来表示(x,y)上的亮度。由于光是一种能量形式,因此亮度是非负

    2024年02月01日
    浏览(61)
  • opencv 图像基础处理_灰度图像

    二值图像表示起来简单方便,但是因为其仅有黑白两种颜色,所表示的图像不够细腻。如果想要表现更多的细节,就需要使用更多的颜色。例如,图 2-3 中的 lena 图像是一幅灰度图像, 它采用了更多的数值以体现不同的颜色,因此该图像的细节信息更丰富。 通常,计算机会将

    2024年02月15日
    浏览(57)
  • 图像处理(二值图、灰度图、彩色图像)

    图像处理之二值图像、灰度图像、RGB图像 1、二值图像 定义:二值图像是值仅仅包含黑色和白色的图像 计算机在处理时,会把黑色像素点处理为0,白色像素点处理1。由于只用一个比特位就能表示,所以称之为二值图像。 2、灰度图 为了表达更丰富的颜色细节,灰度图采用更

    2024年02月06日
    浏览(60)
  • 图像预处理算法————灰度化处理

    图像预处理算法适合在FPGA上完成,原理简单且需要快速处理,通常有灰度化、中值、均值滤波等,以及颜色空间转换算法。 灰度图像是一种特殊的彩色图像(R=G=B的彩色图像) 只有一种颜色分量,单通道的0-255 方法:一般有分量法、最大值法、平均值法、加权平均法四种方

    2024年01月17日
    浏览(51)
  • matlab数字图像处理——图像的读写,灰度、二值图像

    一、实验目的 1.结合数字图像处理的知识,直观感受图像处理的基本实现过程 2.熟悉MATLAB工具的使用 3.了解图像的读写和显示 二、实验内容 实验内容一:图像读取 (1)利用编程实现读取图像 利用imread读取文件夹images中的图像;查看读取到的图像数据矩阵,对比灰度图像、

    2024年02月07日
    浏览(57)
  • Opencv 图像处理:图像基础操作与灰度转化

    本文已收录于Opencv系列专栏: 深入浅出OpenCV ,专栏旨在详解Python版本的Opencv,为计算机视觉的开发与研究打下坚实基础。免费订阅,持续更新。 1.图像格式 图像压缩比: 通过编码器压缩后的图象数字大小和原图象数字大小的压缩比。 BMP 格式 Windows系统下的 标准位图格式 ,

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包