FPGA 图像边缘检测(Canny算子)
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
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。