国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺析基于FPGA自動白平衡算法的簡述與實戰

FPGA開源工作室 ? 來源:CSDN技術社區 ? 作者: FPGA開源工作室 ? 2021-04-06 10:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

基于FPGA自動白平衡算法的實現

1 白平衡介紹

對于白平衡基本概念的詳細介紹請查看文章《白平衡初探》,白平衡算法主要的作用是將偏暖或者偏冷的色調自動恢復到正常色調,是圖像看起來更加色彩飽滿正常。

如上圖所示,左1色溫偏冷,中間色溫正常,右一色溫偏暖。上圖比較直觀的展示了色溫的概念。偏冷的色溫會給人一種還冷的感覺,偏暖的色溫會給人一種溫暖的感覺。

2 白平衡算法以及matlab實現

1)原始的灰度世界算法

灰度世界算法(Gray World)是以灰度世界假設為基礎的,該假設認為對于一幅有著大量色彩變化的圖像, R、 G、 B 三個分量的平均值趨于同一個灰度K。一般有兩種方法來確定該灰度。

(1)直接給定為固定值, 取其各通道最大值的一半,即取為127或128;

(2)令 K = (Raver+Gaver+Baver)/3,其中Raver,Gaver,Baver分別表示紅、 綠、 藍三個通道的平均值。

算法的第二步是分別計算各通道的增益:

Kr=K/Raver;

Kg=K/Gaver;

Kb=K/Baver;

算法第三步為根據Von Kries 對角模型,對于圖像中的每個像素R、G、B,計算其結果值:

Rnew = R * Kr;

Gnew = G * Kg;

Bnew = B * Kb;

對于上式,計算中可能會存在溢出(》255,不會出現小于0的)現象,處理方式有兩種。

a、 直接將像素設置為255,這可能會造成圖像整體偏白。

b、 計算所有Rnew、Gnew、Bnew的最大值,然后利用該最大值將將計算后數據重新線性映射到[0,255]內。實踐證明這種方式將會使圖像整體偏暗,建議采用第一種方案。

2)完美反射算法

原理:完美全反射理論perfect Reflector假設圖像上最亮點就是白點,并以此白點為參考對圖像進行自動白平衡,最亮點定義為R+G+B的最大值,具體編碼步驟如下:

(1)計算每個像素的RGB之和,并保存到一臨時內存塊中。

(2)按R+G+B值的大小計算出其前10%或其他Ratio的白色參考點的的閾值T。

(3)遍歷圖像中的每個點,計算其中R+G+B值大于T的所有點的RGB分量的累積和的平均值。

(4)對每個點將像素量化到[0,255]之間。

3)動態閾值法

(1)。 把圖像w*h從RGB空間轉換到YCrCb空間。

(2)。 選擇參考白色點:

a. 把圖像分成寬高比為4:3個塊(塊數可選)。

b. 對每個塊,分別計算Cr,Cb的平均值Mr,Mb。

c. 對每個塊,根據Mr,Mb,用下面公式分別計算Cr,Cb的方差Dr,Db。

d. 判定每個塊的近白區域(near-white region)。

判別表達式為:

設一個“參考白色點”的亮度矩陣RL,大小為w*h。

若符合判別式,則作為“參考白色點”,并把該點(i,j)的亮度(Y分量)值賦給RL(i,j);

若不符合,則該點的RL(i,j)值為0。

(3)。 選取參考“參考白色點”中最大的10%的亮度(Y分量)值,并選取其中的最小值Lu_min.

(4)。 調整RL,若RL(i,j)《Lu_min, RL(i,j)=0; 否則,RL(i,j)=1;

(5)。 分別把R,G,B與RL相乘,得到R2,G2,B2。 分別計算R2,G2,B2的平均值,Rav,Gav,Bav;

(6)。 得到調整增益:

Ymax=double(max(max(Y)))/5;

Rgain=Ymax/Rav;

Ggain=Ymax/Gav;

Bgain=Ymax/Bav;

(7)。 調整原圖像:

Ro= R*Rgain;

Go= G*Ggain;

Bo= B*Bgain;

FPGA的實現采用灰度世界算法。

Matlab代碼:

close allclear allclcI=imread(‘test1.jpg’);[H,W,L]=size(I);%得到圖像長寬高Rsum = 0;Gsum = 0;Bsum = 0;Rsum = double(Rsum);Gsum = double(Gsum);Bsum = double(Bsum);for i = 1 : H for j = 1 :W Rsum = Rsum + double(I(i,j,1)); Gsum = Gsum + double(I(i,j,2)); Bsum = Bsum + double(I(i,j,3)); endendRaver = Rsum / (H*W);Gaver = Gsum / (H*W);Baver = Bsum / (H*W);%K=128;%第一種K取值方法K = (Raver+Gaver+Baver)/3;%第二種方法Rgain = K / Raver;Ggain = K / Gaver;Bgain = K / Baver;Iwb(:,:,1) = I(:,:,1) * Rgain;Iwb(:,:,2) = I(:,:,2) * Ggain;Iwb(:,:,3) = I(:,:,3) * Bgain;imwrite(Iwb,‘Result1.jpg’);figure(1),subplot(121),imshow(I),title(‘原始圖像’);subplot(122),imshow(Iwb),title(‘自動白平衡圖像’);

效果展示:

3 FPGA實現自動白平衡灰度世界法

灰度世界法Verilog代碼:

/**********************************copyright@FPGA OPEN SOURCE STUDIO微信公眾號:FPGA開源工作室Algorithm:Auto White balance Gray World 800X600X255=480000***********************************/`define XLEN 32`define N(n) [(n)-1:0]module White_balance#( parameter DW = 24 )( input pixelclk, input reset_n, input [DW-1:0] din, //rgb in input i_hsync, input i_vsync, input i_de,

output [DW-1:0] dout, //gray out output o_hsync, output o_vsync, output o_de ); localparam STAGE_LIST = 32‘h0101_0101;//32’b00000000_00000000_00000000_00000000;localparam divisor = 32‘h0007_5300;//800*600localparam divisorK = 32’h0000_0003;//800*600 wire [7:0] R,G,B;reg [27:0] sumr,sumg,sumb;reg [27:0] sumr_r,sumg_r,sumb_r;wire [9:0] Kave;wire [7:0] K;

wire Rack;wire `N(`XLEN) Rquo,Rrem;

wire Gack;wire `N(`XLEN) Gquo,Grem;

wire Back;wire `N(`XLEN) Bquo,Brem;

wire Kack;wire `N(`XLEN) Kquo,Krem;

wire GRack;wire `N(`XLEN) GRquo,GRrem;

wire GGack;wire `N(`XLEN) GGquo,GGrem;

wire GBack;wire `N(`XLEN) GBquo,GBrem;

reg [39:0] R_r,G_r,B_r;wire [7:0] RO,GO,BO;

reg hsync_r1;reg vsync_r1;reg de_r1;

reg i_vsync_r;reg vsync_neg_r;

wire vsync_neg=(i_vsync_r&(~i_vsync));

assign Kave=(Rquo+Gquo+Bquo);assign K=Kquo[7:0];

assign R=din[23:16];assign G=din[15:8];assign B=din[7:0];

assign o_hsync = hsync_r1;assign o_vsync = vsync_r1;assign o_de = de_r1;

assign RO=(R_r[18:10]》255)?255:R_r[17:10];assign GO=(G_r[18:10]》255)?255:G_r[17:10];assign BO=(B_r[18:10]》255)?255:B_r[17:10];assign dout={RO,GO,BO};

//synchronizationalways @(posedge pixelclk) begin hsync_r1 《= i_hsync; vsync_r1 《= i_vsync; de_r1 《= i_de;end

always @(posedge pixelclk or negedge reset_n)begin if(!reset_n)begin sumr《=28‘d0;《 span=“”》 sumg《=28’d0;《 span=“”》 sumb《=28‘d0;《 span=“”》 sumr_r《=28’d0;《 span=“”》 sumg_r《=28‘d0;《 span=“”》 sumb_r《=28’d0;《 span=“”》 i_vsync_r《=1‘b0;《 span=“”》 vsync_neg_r《=1’b0;《 span=“”》 R_r《=40‘b0;《 span=“”》 G_r《=40’b0;《 span=“”》 B_r《=40‘b0;《 span=“”》 end else begin i_vsync_r《=i_vsync;《 span=“”》 vsync_neg_r《=vsync_neg;《 span=“”》 R_r《=r*grquo;《 span=“”》 G_r《=g*ggquo;《 span=“”》 B_r《=b*gbquo;《 span=“”》 if(vsync_neg==1’b1) begin sumr_r《=sumr;《 span=“”》 sumg_r《=sumg;《 span=“”》 sumb_r《=sumb;《 span=“”》 end if(i_vsync==1‘b1) begin if(i_de==1’b1) begin sumr《=sumr+r;《 span=“”》 sumg《=sumg+g;《 span=“”》 sumb《=sumb+b;《 span=“”》 end else begin sumr《=sumr;《 span=“”》 sumg《=sumg;《 span=“”》 sumb《=sumb;《 span=“”》 end end else begin sumr《=28‘d0;《 span=“”》 sumg《=28’d0;《 span=“”》 sumb《=28‘d0;《 span=“”》 end endend

//Rave divfunc #( .XLEN ( `XLEN ), .STAGE_LIST ( STAGE_LIST )

) i_divR ( .clk ( pixelclk ), .rst ( ~reset_n ), .a ( {4’b0,sumr_r} ), .b ( divisor ), .vld ( vsync_neg_r ), .quo ( Rquo ), .rem ( Rrem ), .ack ( Rack )

);

//Gave divfunc #( .XLEN ( `XLEN ), .STAGE_LIST ( STAGE_LIST )

) i_divG ( .clk ( pixelclk ), .rst ( ~reset_n ), .a ( {4‘b0,sumg_r} ), .b ( divisor ), .vld ( vsync_neg_r ), .quo ( Gquo ), .rem ( Grem ), .ack ( Gack )

);

//Bave divfunc #( .XLEN ( `XLEN ), .STAGE_LIST ( STAGE_LIST )

) i_divB ( .clk ( pixelclk ), .rst ( ~reset_n ), .a ( {4’b0,sumb_r} ), .b ( divisor ), .vld ( vsync_neg_r ), .quo ( Bquo ), .rem ( Brem ), .ack ( Back )

);

//Kdivfunc #( .XLEN ( `XLEN ), .STAGE_LIST ( STAGE_LIST )

) i_divK ( .clk ( pixelclk ), .rst ( ~reset_n ), .a ( {22‘b0,Kave} ), .b ( divisorK ), .vld ( Back ), .quo ( Kquo ), .rem ( Krem ), .ack ( Kack )

);

//RGaindivfunc #( .XLEN ( `XLEN ), .STAGE_LIST ( STAGE_LIST )

) i_divGR ( .clk ( pixelclk ), .rst ( ~reset_n ), .a ( {14’b0,K,10‘b0} ), .b ( Rquo ), .vld ( Kack ), .quo ( GRquo ), .rem ( GRrem ), .ack ( GRack )

);

//GGaindivfunc #( .XLEN ( `XLEN ), .STAGE_LIST ( STAGE_LIST )

) i_divGG ( .clk ( pixelclk ), .rst ( ~reset_n ), .a ( {14’b0,K,10‘b0} ), .b ( Gquo ), .vld ( Kack ), .quo ( GGquo ), .rem ( GGrem ), .ack ( GGack )

);

//BGAINdivfunc #( .XLEN ( `XLEN ), .STAGE_LIST ( STAGE_LIST )

) i_divGB ( .clk ( pixelclk ), .rst ( ~reset_n ), .a ( {14’b0,K,10‘b0} ), .b ( Bquo ), .vld ( Kack ), .quo ( GBquo ), .rem ( GBrem ), .ack ( GBack )

);

endmodule

1)仿真效果

原始圖像

經過灰度世界法的白平衡仿真效果

2)下板驗證模型以及實現效果

下板驗證圖像由筆記本電腦通過HDMI輸入到FPGA芯片,經過FPGA算法處理后在通過HDMI將圖像送到顯示屏展示處理效果。

筆記本電腦顯示圖片

經過FPGA處理后的顯示效果
編輯:lyn

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1660

    文章

    22410

    瀏覽量

    636260
  • 白平衡
    +關注

    關注

    0

    文章

    14

    瀏覽量

    8159

原文標題:基于FPGA的自動白平衡算法的實現

文章出處:【微信號:leezym0317,微信公眾號:FPGA開源工作室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    芯片過熱導致鎖死?全自動燒錄機溫控系統的優化實戰

    。 額外收益:溫度日志幫助發現,來自不同封裝廠的芯片,其發熱特性有細微差異。這為后續的芯片來料質量評估提供了一個新的觀察維度。 總結與反思這次優化實戰揭示了一個常見誤區:全自動燒錄機的可靠性,不只取決于
    發表于 02-11 09:34

    KMbalancerII+動平衡等級評估功能介紹#動平衡儀#動平衡校正

    平衡
    KM預測性維護專家
    發布于 :2025年11月04日 16:36:39

    EMC電路怎么整改:如何縮短整改周期的實戰案例

    EMC電路怎么整改:如何縮短整改周期的實戰案例|南柯電子
    的頭像 發表于 10-20 10:17 ?653次閱讀

    基于FPGA的CLAHE圖像增強算法設計

    CLAHE圖像增強算法又稱為對比度有限的自適應直方圖均衡算法,其算法原理是通過有限的調整圖像局部對比度來增強有效信號和抑制噪聲信號。
    的頭像 發表于 10-15 10:14 ?649次閱讀
    基于<b class='flag-5'>FPGA</b>的CLAHE圖像增強<b class='flag-5'>算法</b>設計

    舵機原理簡述!

    舵機原理簡述 舵機是一種高精度的位置伺服執行機構,廣泛應用于機器人關節、無人機舵面控制、航模操控等場景,其核心功能是通過接收控制信號,精確驅動輸出軸旋轉到指定角度并保持穩定。以下從結構組成、控制
    的頭像 發表于 08-22 10:57 ?1870次閱讀

    UWB自動跟隨技術原理、算法融合優化和踩坑實錄

    UWB為什么是最靠譜的自動跟隨技術?原理是什么?需要做什么算法融合、優化?我們在開發過程中踩過的坑。
    的頭像 發表于 08-14 17:45 ?1542次閱讀
    UWB<b class='flag-5'>自動</b>跟隨技術原理、<b class='flag-5'>算法</b>融合優化和踩坑實錄

    無感FOC算法:如何在動態與穩定之間找到最優平衡?--【其利天下】

    在無感FOC(Field-OrientedControl,磁場定向控制)算法中,動態響應和穩定性是電機控制系統中兩個非常重要的性能指標。動態響應指的是系統對輸入信號變化的快速反應能力,而穩定性則是指
    的頭像 發表于 08-08 18:38 ?6344次閱讀
    無感FOC<b class='flag-5'>算法</b>:如何在動態與穩定之間找到最優<b class='flag-5'>平衡</b>?--【其利天下】

    KM介紹如何確定動平衡校正后的振動符合標準?#動平衡儀 #動平衡校正

    平衡
    KM預測性維護專家
    發布于 :2025年08月07日 15:33:38

    Ansible代碼上線項目實戰案例

    在DevOps浪潮中,自動化部署已經成為每個運維工程師的必備技能。今天我將分享一個完整的Ansible代碼上線項目實戰案例,讓你的部署效率提升10倍!
    的頭像 發表于 07-24 14:03 ?580次閱讀

    基于FPGA實現FOC算法之PWM模塊設計

    哈嘍,大家好,從今天開始正式帶領大家從零到一,在FPGA平臺上實現FOC算法,整個算法的框架如下圖所示,如果大家對算法的原理不是特別清楚的話,可以先去百度上學習一下,本教程著重介紹實現
    的頭像 發表于 07-17 15:21 ?3490次閱讀
    基于<b class='flag-5'>FPGA</b>實現FOC<b class='flag-5'>算法</b>之PWM模塊設計

    基于Matlab與FPGA的雙邊濾波算法實現

    前面發過中值、均值、高斯濾波的文章,這些只考慮了位置,并沒有考慮相似度。那么雙邊濾波來了,既考慮了位置,有考慮了相似度,對邊緣的保持比前幾個好很多,當然實現上也是復雜很多。本文將從原理入手,采用Matlab與FPGA設計實現雙邊濾波算法
    的頭像 發表于 07-10 11:28 ?4559次閱讀
    基于Matlab與<b class='flag-5'>FPGA</b>的雙邊濾波<b class='flag-5'>算法</b>實現

    基于FPGA的壓縮算法加速實現

    本設計中,計劃實現對文件的壓縮及解壓,同時優化壓縮中所涉及的信號處理和計算密集型功能,實現對其的加速處理。本設計的最終目標是證明在充分并行化的硬件體系結構 FPGA 上實現該算法時,可以大大提高該算法
    的頭像 發表于 07-10 11:09 ?2389次閱讀
    基于<b class='flag-5'>FPGA</b>的壓縮<b class='flag-5'>算法</b>加速實現

    是德示波器MSOX3104A自動測量功能詳解與實戰技巧

    與高效化。通過自動識別信號特征、一鍵生成測量結果,該設備顯著降低了人工操作的復雜性,提升了測量精度與效率。本文將圍繞其自動測量功能的原理、操作步驟及實戰應用展開詳細探討。 ? 二、MSOX3104A
    的頭像 發表于 07-03 13:52 ?682次閱讀
    是德示波器MSOX3104A<b class='flag-5'>自動</b>測量功能詳解與<b class='flag-5'>實戰</b>技巧

    同步電機失步淺析

    純分享帖,需要者可點擊附件免費獲取完整資料~~~*附件:同步電機失步淺析.pdf【免責聲明】本文系網絡轉載,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請第一時間告知,刪除內容!
    發表于 06-20 17:42

    KM科普小課堂 動平衡儀和動平衡機的區別#動平衡儀#動平衡校正

    平衡
    KM預測性維護專家
    發布于 :2025年05月13日 15:10:05