Down-Sampling 降采样(Verilog)

  • Post author:
  • Post category:其他


简介

在图像处理领域中,降采样是一个非常常用的图像处理方法,目的是为了在大体上不改变图片的情况下,缩小图像,降低分辨率,减少数据的计算量,生成对应图像的降采样图。本质就是抽取图像数据来降低特征的维度进而保留有效的信息。

原理

对一个需要处理的图片的像素值序列间隔几个像素值取样一次,也就是抽取像素值,得到的新的像素值序列就是原像素值序列的降采样,也称为下采样。

降采样分为整数倍降采样和分数倍降采样,在这篇文章中,介绍的是比较常用的 2 倍降采样,也可以说是奇数降采样或偶数降采样。

模块端口图

这里把 RGB 数据的三个通道都列了出来,当然也可以用其他的图像数据格式,如:YUV 。

设计文件代码

以下为降采样的设计代码,留下的是偶数列的图像数据。代码中控制计数器的为 MCNT,也就是计数最大值,这个视情况而定,也可用数据有效信号(Data_valid)来控制计数器。

   module Down_Sampling(
          Data_in_r,
          Data_in_g, 
          Data_in_b,

          clk,
          rst_n,
 
          Data_out_r,
          Data_out_g,
          Data_out_b,

);


       input [7:0] Data_in_r;
       input [7:0] Data_in_g;
       input [7:0] Data_in_b;

       input clk;
       input rst_n;

       output [7:0] Data_out_r;
       output [7:0] Data_out_g;
       output [7:0] Data_out_b;


       parameter MCNT = 根据情况定 也可用数据有效信号控制;

          reg [10:0] Data_cnt;
   always@(posedge clk or negedge rst_n)
         if(!rst_n)
              Data_cnt <= 0;
         else if(Data_cnt == MCNT) 
              Data_cnt <= 0;
         else 
              Data_cnt <= Data_cnt + 1;

   always@(posedge clk or negedge rst_n)
         if(!rst_n)begin
              Data_out_r <= 0;
              Data_out_g <= 0;
              Data_out_b <= 0;
         end
         else if(!Data_cnt[0])begin
              Data_out_r <= Data_in_r;
              Data_out_g <= Data_in_g;
              Data_out_b <= Data_in_b;
            end  
            else begin
              Data_out_r <= Data_out_r;
              Data_out_g <= Data_out_g;
              Data_out_b <= Data_out_b;
            end

      
endmodule

以下为留下奇数列的图像数据。

   module Down_Sampling(
          Data_in_r,
          Data_in_g, 
          Data_in_b,

          clk,
          rst_n,
 
          Data_out_r,
          Data_out_g,
          Data_out_b,

);


       input [7:0] Data_in_r;
       input [7:0] Data_in_g;
       input [7:0] Data_in_b;

       input clk;
       input rst_n;

       output [7:0] Data_out_r;
       output [7:0] Data_out_g;
       output [7:0] Data_out_b;


       parameter MCNT = 根据情况定 也可用数据有效信号控制;

          reg [10:0] Data_cnt;
   always@(posedge clk or negedge rst_n)
         if(!rst_n)
              Data_cnt <= 0;
         else if(Data_cnt == MCNT) 
              Data_cnt <= 0;
         else 
              Data_cnt <= Data_cnt + 1;

   always@(posedge clk or negedge rst_n)
         if(!rst_n)begin
              Data_out_r <= 0;
              Data_out_g <= 0;
              Data_out_b <= 0;
         end
         else if(Data_cnt[0])begin
              Data_out_r <= Data_in_r;
              Data_out_g <= Data_in_g;
              Data_out_b <= Data_in_b;
            end  
            else begin
              Data_out_r <= Data_out_r;
              Data_out_g <= Data_out_g;
              Data_out_b <= Data_out_b;
            end

      
endmodule



版权声明:本文为qq_53433410原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。