fpga圖片灰度處理


 

vga顯示靜態圖品主要分為兩個部分,一個是驅動vga,另一部分控制vga顯示。

vga驅動部分之前寫過,直接例化過來用即可。

另一個是vga顯示,從網上找了一個200*200的lena圖品,然后用BMP2Mif軟件

將圖片轉換成mif文件,24*40000,24代表rgb三原色,4000代表像素,在200*200

的區域內,一共有40000個像素點,然后把mif文件存進rom里,vga顯示出來即可。

/*-----------------------------------------------------------------------

Date                :        2017-XX-XX
Description            :        Design for .

-----------------------------------------------------------------------*/


module vga_control
(
    //global clock
    input                    clk,            //system clock
    input                    rst_n,             //sync reset
    
    //vga interface
    input            [10:0]    value_x,
    input            [10:0]    value_y,
    output            [23:0]    rgb,

    //rom interface

    output    reg        [15:0]    rom_addr,        //
    input            [23:0]    rom_q
); 


//--------------------------------
//Funtion :    display_區域           

wire        display_addr;
assign        display_addr    =    ((value_x >= 8'd100 && value_x < 9'd300) && (value_y >= 8'd100 && value_y < 9'd300)) ? 1'b1 : 1'b0;



//--------------------------------
//Funtion :    rgb

assign        rgb                =    (display_addr == 1'b1) ? rom_q : 1'd0; 

//--------------------------------
//Funtion :    rom_addr

wire        [10:0]        display_x;
wire        [10:0]        display_y;

assign            display_x        =    value_x - 8'd100;
assign            display_y        =    value_y    - 8'd100;


always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        rom_addr <= 1'd0;
    else if(display_addr)
        rom_addr <= display_x  +  display_y*200;
    else
        rom_addr <= 1'd0;
end


endmodule
    

 

將圖品進行灰度處理,把圖片進行灰度化我搜了一下,一是可以加快運算速度,第二點色彩對於計算本身並沒有作用,所以把它舍棄。

彩色轉灰度公式 : gray = RX0.299 + GX0.587 + BX0.114;

fpga里面的寄存器都是整數,所以需要對數據進行放大,可能思維固化了吧,第一反應是這樣的

因為都是三位小數,我會乘上1000然后除1000,但是除法速度明顯不如移位,其實可以這樣

把每位都乘上2^16,然后右移16位即可

//--------------------------------
//Funtion :    rgb

//assign        rgb                =    (display_addr == 1'b1) ? rom_q : 1'd0; 
assign        rgb                =    (display_addr == 1'b1) ? {3{gray}} : 1'd0; 


//--------------------------------
//Funtion :    轉灰度處理
wire        [7:0]        gray;

assign        gray = (rom_q[23:16]*19595 + rom_q[15:8]*38469 + rom_q[7:0]*7472) >> 16;

這樣一看,灰度化其實也挺簡單的,沒有那么神秘


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM