FPGA 图像边缘检测(Canny算子)

04-06 1128阅读

1 顶层代码

`timescale 1ns / 1ps
//边缘检测二阶微分算子:canny算子
module image_canny_edge_detect (
    input clk,
    input reset, //复位高电平有效
    input [10:0] img_width,
    input [ 9:0] img_height,
    input [ 7:0] low_threshold,
    input [ 7:0] high_threshold,
    input valid_i,
    input [15:0] rgb_565_i,  // 输入的16位RGB图像数据
    output        valid_o,
    output [15:0] rgb_565_o  // 输出的16位RGB图像数据
);
  //变量声明
  wire valid_gray;
  wire [7:0] img_data_gray;
  wire valid_gf;
  wire [7:0] img_data_gf;
  wire valid_sbl;
  wire [7:0] grad_mag;
  wire [10:0] grad_dx;
  wire [10:0] grad_dy;
  wire valid_nms;
  wire [7:0] img_data_nms;
  wire valid_db;
  wire [7:0] img_data_db;
  wire [23:0] img_data_i, img_data_o;
  assign img_data_i = {rgb_565_i[15:11], 3'b000, rgb_565_i[10:5], 2'b00, rgb_565_i[4:0], 3'b000};
  assign rgb_565_o  = {{img_data_o[23:19], img_data_o[15:10], img_data_o[7:3]}};
  //彩色图像灰度化
  image_rgb2gray u_image_rgb2gray (
      .clk       (clk),
      .reset     (reset),
      .valid_i   (valid_i),
      .img_data_i(img_data_i),
      .valid_o   (valid_gray),
      .img_data_o(img_data_gray)
  );
  ///高斯滤波
  image_gaussian_filter u_image_gaussian_filter (
      .clk       (clk),
      .reset     (reset),
      .img_width (img_width),
      .img_height(img_height),
      .valid_i   (valid_gray),
      .img_data_i(img_data_gray),
      .valid_o   (valid_gf),
      .img_data_o(img_data_gf)
  );
  ///Sobel算子
  image_sobel_edge u_image_sobel_edge (
      .clk       (clk),
      .reset     (reset),
      .img_width (img_width),
      .img_height(img_height),
      .valid_i   (valid_gf),
      .img_data_i(img_data_gf),
      .valid_o   (valid_sbl),
      .grad_mag  (grad_mag),
      .grad_dx   (grad_dx),
      .grad_dy   (grad_dy)
  );
  ///非极大值计算
  non_maximum_suppression u_non_maximum_suppression (
      .clk       (clk),
      .reset     (reset),
      .img_width (img_width),
      .img_height(img_height),
      .valid_i   (valid_sbl),
      .grad_mag  (grad_mag),
      .grad_dx   (grad_dx),
      .grad_dy   (grad_dy),
      .valid_o   (valid_nms),
      .img_data_o(img_data_nms)
  );
  双阈值
  //根据输入的低阈值和高阈值来判断,如果这个像素点大于高阈值,则赋值为255;如果低于低阈值,则赋值为0;
  double_threshold u_double_threshold (
      .clk           (clk),
      .reset         (reset),
      .img_width     (img_width),
      .img_height    (img_height),
      .low_threshold (low_threshold),
      .high_threshold(high_threshold),
      .valid_i       (valid_nms),
      .img_data_i    (img_data_nms),
      .valid_o       (valid_db),
      .img_data_o    (img_data_db)
  );
  assign valid_o = valid_db;
  assign img_data_o = {3{img_data_db}};
endmodule

2 彩色图变灰度图代码

`timescale 1ns / 1ps
//彩色图像灰度化
module image_rgb2gray (
    input clk,
    input reset,
    input valid_i,
    input [23:0] img_data_i,
    output valid_o,
    output [7:0] img_data_o
);
  //常量
  parameter MODE = 0;  //0表示加权平均法,1表示平均法 
  //Y=0.299*R十0.587*G+0.114*B
  parameter C0 = 9'd306;  //0.299*1024;
  parameter C1 = 10'd601;  //0.587*1024;
  parameter C2 = 7'd117;  //0.114*1024;
  //参数声明
  wire [7:0] R, G, B;
  assign {R, G, B} = img_data_i;
  generate
    if (MODE) begin
      reg valid_d1;
      reg [9:0] RGB_avr;
      reg valid_d2;
      reg [16:0] RGB_avr_m;
      reg valid_d3;
      reg [7:0] RGB_new;
      //平均法
      //1/3 * 512 = 171
      always @(posedge clk) begin
        if (reset) begin
          valid_d1 

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]