0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FPGA的直方圖拉伸方案

FPGA之家 ? 來源:FPGA開源工作室 ? 2023-05-04 09:38 ? 次閱讀

1背景知識

視頻處理中,為了能夠?qū)崟r調(diào)節(jié)圖像的對比對,通常需要對直方圖進(jìn)行拉伸處理。直方圖拉伸是指將圖像灰度直方圖較窄的灰度級區(qū)間向兩端拉伸,增強(qiáng)整幅圖像像素的灰度級對比度,達(dá)到增強(qiáng)圖像的效果。

常用的直方圖拉伸方法有線性拉伸、3段式分段線性拉伸和非線性拉伸等。FPGA中常見的是線性拉伸。

線性拉伸就是灰度拉伸,屬于線性點(diǎn)運(yùn)算的一種。它擴(kuò)展圖像的直方圖,使其充滿整個灰度級范圍內(nèi)。

設(shè)f(x,y)為輸入圖像,它的最小灰度級A和最大灰度級B的定義如下:

A=min[f(x,y)];

B=max[f(x,y)];

將A和B分別映射到0和255,則最終的輸出圖像g(x,y)為

g(x,y)=255*[f(x,y)-A]/(B-A)

e20d8aca-e87e-11ed-ab56-dac502259ad0.jpg

e21dc2dc-e87e-11ed-ab56-dac502259ad0.jpg

如上圖所示,上a和下a分別為未進(jìn)行拉伸的原始圖像和直方圖,上b和下b為拉伸后的圖像和直方圖。很容易發(fā)現(xiàn)直方圖分布較窄的a圖像經(jīng)過拉伸后直方圖變寬而且對比度明顯提高。

2 matlab實(shí)現(xiàn)直方圖拉伸

closeall

clearall;

clc;

I = imread('car0.bmp');

Igray = rgb2gray(I);

Imin=min(min(Igray));

Imax=max(max(Igray));

HW = size(Igray);

H =HW(1);

W =HW(2);

C =255/(Imax-Imin);

Inew = zeros(size(Igray));

fori=1:H

forj=1:W

if(Igray(i,j)==Imin)

Inew(i,j)=0;

elseif(Igray(i,j)==Imax)

Inew(i,j)=255;

else

Inew(i,j)=(C.*(Igray(i,j)-Imin));

end

end

end

Inew = uint8(Inew);

figure(1),

subplot(221),imshow(Igray);

title('Igray');

subplot(223),imshow(Inew);

title('Inew');

subplot(222),imhist(Igray);

title('Igray');

subplot(224),imhist(Inew);

title('Inew');

e230f280-e87e-11ed-ab56-dac502259ad0.jpg

Matlab實(shí)現(xiàn)彩色圖像拉伸

close all
clear all;
clc;
 
I = imread('lena.jpg');
Istretch=HistRGB(I);
 
figure(1),
subplot(211),imshow(I);
title('I');
subplot(212),imshow(Istretch);
title('Istretch');

function [OUT] = HistRGB(I)
    for i = 1:3
        I(:,:,i) = HistGray(I(:,:,i));
    end
    OUT = uint8(I);
end

function [Inew] = HistStretch(Igray)
Imin=min(min(Igray));
Imax=max(max(Igray));
 
HW = size(Igray);
H =HW(1);
W =HW(2);
C =255/(Imax-Imin);
Inew = zeros(size(Igray));
for i=1:H
   for j=1:W
       if(Igray(i,j)==Imin)
           Inew(i,j)=0;
       elseif(Igray(i,j)==Imax)
           Inew(i,j)=255;
       else
           Inew(i,j)=(C.*(Igray(i,j)-Imin));
       end
   end
end
Inew = uint8(Inew);
end

3 FPGA實(shí)現(xiàn)灰度圖像拉伸

FPGA實(shí)現(xiàn)灰度圖像的拉伸可分為真拉伸和偽拉伸,真拉伸需要對圖像進(jìn)行一幀的緩存,偽拉伸其實(shí)是在前一幀計(jì)算出最大和最后灰度級的基礎(chǔ)上完成當(dāng)前圖像的拉伸處理,這樣比較節(jié)省資源。

1,計(jì)算灰度圖像的最大最小灰度級A,B;

2,完成灰度圖像的拉伸。

/**********************************
copyright@FPGA OPEN SOURCE STUDIO
微信公眾號:FPGA開源工作室
***********************************/
//800*600 =  480000
//Pseudo histogram linear stretch
//Algorithm:g(x,y) = 255*(f(x,y)-A)/(B-A)
//B--Grayscale max
//A--Grayscale min
 
module hist_Stretch#(
       parameter DW = 24
      )(
      input                      pixelclk,
      input                      reset_n,
      input [DW-1:0]    din,//gray888
      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
   );
   
wire [7:0] gray = din[7:0];//gray--8bit
reg  [7:0] gray_r;
reg        vsync_r;
reg        hsync_r;
reg        de_r;
 
wire [7:0]gray_max;//gray max
wire [7:0]gray_min;//gray min
 
wire       vsync_pos = (i_vsync&(!vsync_r));//frame start
wire       vsync_neg = (!i_vsync&vsync_r);  //frame end
assign dout = {gray_r,gray_r,gray_r};
assign o_hsync = hsync_r;
assign o_vsync = vsync_r;
assign o_de = de_r;
 
always @(posedge pixelclk) begin
  vsync_r <= i_vsync;
  hsync_r <= i_hsync;
  de_r <= i_de;
end
 
always @(posedge pixelclk or negedge reset_n)begin
  if(reset_n == 1'b0) begin
gray_r<=0;
  end
  else begin
if(i_de ==1'b1) begin
  if(gray>gray_max)
    gray_r<=8'd255;
  else if(gray

/*
Module name:  minmax.v
Description:  Get the maximum and minimum gray level of a frame of image
              
Date:         2019/12/02
微信公眾號:    FPGA開源工作室
*/
`timescale 1ns/1ps
module minmax#(parameter DW = 8
      )(
      input                      pixelclk,
      input                      reset_n,
      input [DW-1:0]    din,//gray--8
      input                      i_hsync,
      input                      i_vsync,
      input                      i_de,
  
  output reg [DW-1:0]gray_max,//gray max out
  output reg  [DW-1:0]gray_min//gray min out
   );
 
reg [DW-1:0]gray_maxr;//gray max
reg [DW-1:0]gray_minr;//gray min
 
//reg  [7:0] gray_r;
reg        vsync_r;
reg de_r;
 
wire       vsync_pos = (i_vsync&(!vsync_r));//frame start
wire       vsync_neg = (!i_vsync&vsync_r);  //frame end
 
always @(posedge pixelclk) begin
  de_r <= i_de;
  vsync_r<=i_vsync;
end
 
always @(posedge pixelclk or negedge reset_n)begin
  if(!reset_n) begin
    gray_maxr<= 8'd0;
gray_minr<= 8'd255;
  end  
  else begin
    if(i_vsync ==1'b1 && i_de ==1'b1) begin
  gray_maxr<= (gray_maxr>din)?gray_maxr:din;
  gray_minr<= (din>gray_minr)?gray_minr:din;    
end
else if(vsync_neg == 1'b1)begin
  gray_max<= gray_maxr;
  gray_min<= gray_minr;
  gray_maxr<= 8'd0;
  gray_minr<= 8'd255;
end
else begin
  gray_max<= gray_max;
  gray_min<= gray_min;
  gray_maxr<= gray_maxr;
  gray_minr<= gray_minr;
end
  end
end
 
 
endmodule

未經(jīng)拉伸的圖像感覺蒙了一層霧,經(jīng)過拉伸后圖像對比度明顯增強(qiáng)。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1620

    文章

    21510

    瀏覽量

    598951
  • matlab
    +關(guān)注

    關(guān)注

    179

    文章

    2946

    瀏覽量

    229466

原文標(biāo)題:基于FPGA的直方圖拉伸

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于直方圖算法進(jìn)行FPGA架構(gòu)設(shè)計(jì)

    引言 直方圖統(tǒng)計(jì)在圖像增強(qiáng)和目標(biāo)檢測領(lǐng)域有重要應(yīng)用,比如直方圖均衡,梯度直方圖直方圖的不同種類和統(tǒng)計(jì)方法請見之前的文章。本章就是用FPGA
    的頭像 發(fā)表于 12-10 16:37 ?2631次閱讀

    FPGA直方圖處理方法

    圖像直方圖用作數(shù)字圖像中色調(diào)分布的圖形表示。它繪制了每個色調(diào)值的像素?cái)?shù)。通過查看特定圖像的直方圖,觀看者將能夠一目了然地判斷整個色調(diào)分布。
    的頭像 發(fā)表于 12-15 09:20 ?949次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>直方圖</b>處理方法

    一文帶你了解FPGA直方圖操作

    灰度變換等處理過程。 而FPGA對于直方圖處理主要分為以下三種: 我們常見或者聽說的直方圖概念主要指直方圖均衡,這也是最簡單的一種方式,常見某些入門級的圖像處理書籍或者文章。
    發(fā)表于 01-10 15:07

    DSP國產(chǎn)教學(xué)實(shí)驗(yàn)箱_嵌入式教程:5-7 直方圖均衡化

    對比度增強(qiáng)方法。直方圖拉伸直方圖均衡化是兩種最常見的間接對比度增強(qiáng)方法。直方圖拉伸是通過對比度拉伸直方圖進(jìn)行調(diào)整,從而“擴(kuò)大”前景和背景
    發(fā)表于 07-12 15:47

    圖像自適應(yīng)分段線性拉伸算法的FPGA設(shè)計(jì)

    。1 自適應(yīng)線性分段線性灰度級拉伸算法首先對紅外圖像做灰度直方圖統(tǒng)計(jì),低信噪比條件下,選取壓縮因子為5%,將盲元和噪聲的影響降到最低。分別搜索5%最大灰度值中的最小值作為Xmax,5%最小灰度值里
    發(fā)表于 04-27 14:37

    基于FPGA的HDTV視頻圖像灰度直方圖統(tǒng)計(jì)算法設(shè)計(jì)

    亮度分布特性有力的工具,根據(jù)它的結(jié)果可以進(jìn)行諸如灰度拉伸、自動對比度、動態(tài)伽馬調(diào)整等操作。圖1 Lena 圖像的灰度直方圖統(tǒng)計(jì)FPGA算法統(tǒng)計(jì)在計(jì)算機(jī)或者DSP 上實(shí)現(xiàn)直方圖統(tǒng)計(jì)時,我
    發(fā)表于 05-14 12:37

    FPGA圖像處理 直方圖統(tǒng)計(jì)并灰度拉伸 然后VGA顯示的問題

    本人目前用FPGA做一個圖像處理并VGA顯示的東西,中間用到直方圖統(tǒng)計(jì)并灰度拉伸,使圖像對比度提高?,F(xiàn)在遇到一個問題,取統(tǒng)計(jì)的5%和95%的灰度值作為閾值,當(dāng)當(dāng)前像素值來到的時候,以當(dāng)前灰度值做一個
    發(fā)表于 06-28 09:35

    基于FPGA的圖像直方圖實(shí)時顯示

    ``基于FPGA的圖像直方圖實(shí)時顯示 AT7_Xilinx開發(fā)板(USB3.0+LVDS)資料共享 騰訊鏈接:https://share.weiyun.com/5GQyKKc 百度網(wǎng)盤鏈接
    發(fā)表于 07-12 17:33

    基于FPGA的圖像直方圖均衡處理

    `基于FPGA的圖像直方圖均衡處理 AT7_Xilinx開發(fā)板(USB3.0+LVDS)資料共享 騰訊鏈接:https://share.weiyun.com/5GQyKKc 百度網(wǎng)盤鏈接:https
    發(fā)表于 07-14 17:26

    TI C6000教學(xué)實(shí)驗(yàn)箱操作教程:5-8 直方圖均衡化(LCD顯示)

    是間接對比度增強(qiáng)方法。直方圖拉伸直方圖均衡化是兩種最常見的間接對比度增強(qiáng)方法。直方圖拉伸是通過對比度拉伸直方圖進(jìn)行調(diào)整,從而“擴(kuò)大”前景
    發(fā)表于 12-07 14:20

    基于直方圖變換的LED背光源節(jié)電調(diào)光方法

    摘要: 背光源的功耗最高可占液晶顯示模組總功耗的50%以上,文章提出一種基于直方圖變換的背光源節(jié)電調(diào)光方法,在ARM 平臺上通過直方圖的裁剪、搬移和拉伸對圖像進(jìn)行處理,其后
    發(fā)表于 07-19 15:41 ?2538次閱讀
    基于<b class='flag-5'>直方圖</b>變換的LED背光源節(jié)電調(diào)光方法

    基于直方圖算法的FPGA設(shè)計(jì)架構(gòu)

    直方圖統(tǒng)計(jì)在圖像增強(qiáng)和目標(biāo)檢測領(lǐng)域有重要應(yīng)用,比如直方圖均衡,梯度直方圖直方圖的不同種類和統(tǒng)計(jì)方法請見之前的文章。本章就是用FPGA來進(jìn)行
    發(fā)表于 04-20 10:47 ?1147次閱讀
    基于<b class='flag-5'>直方圖</b>算法的<b class='flag-5'>FPGA</b>設(shè)計(jì)架構(gòu)

    剖析FPGA灰度直方圖線性拉伸

    純工程師社群 直方圖線性拉伸相對于直方圖均衡化來說就更好理解一些了,即用線性變化將灰度直方圖較窄的部分拉伸至整個區(qū)間,增強(qiáng)整幅圖像的對比度。
    的頭像 發(fā)表于 07-02 10:37 ?2916次閱讀
    剖析<b class='flag-5'>FPGA</b>灰度<b class='flag-5'>直方圖</b>線性<b class='flag-5'>拉伸</b>

    基于FPGA直方圖線性拉伸的解決方案與對比分析

    但是實(shí)際應(yīng)用中并不會直接采用上述的A和B,這是由于圖像中可能存在噪聲的原因。想象如果圖像中存在幾個純白點(diǎn)(255)和純黑點(diǎn)(0),那么拉伸后的效果就無法達(dá)到預(yù)期。
    的頭像 發(fā)表于 07-02 10:38 ?2075次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>直方圖</b>線性<b class='flag-5'>拉伸</b>的解決<b class='flag-5'>方案</b>與對比分析

    基于FPGA灰度直方圖線性拉伸

    但是實(shí)際應(yīng)用中并不會直接采用上述的A和B,這是由于圖像中可能存在噪聲的原因。想象如果圖像中存在幾個純白點(diǎn)(255)和純黑點(diǎn)(0),那么拉伸后的效果就無法達(dá)到預(yù)期。
    的頭像 發(fā)表于 06-08 10:15 ?2334次閱讀