1背景知識
在視頻處理中,為了能夠實時調節圖像的對比對,通常需要對直方圖進行拉伸處理。直方圖拉伸是指將圖像灰度直方圖較窄的灰度級區間向兩端拉伸,增強整幅圖像像素的灰度級對比度,達到增強圖像的效果。
常用的直方圖拉伸方法有線性拉伸、3段式分段線性拉伸和非線性拉伸等。FPGA中常見的是線性拉伸。
線性拉伸就是灰度拉伸,屬于線性點運算的一種。它擴展圖像的直方圖,使其充滿整個灰度級范圍內。
設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)
如上圖所示,上a和下a分別為未進行拉伸的原始圖像和直方圖,上b和下b為拉伸后的圖像和直方圖。很容易發現直方圖分布較窄的a圖像經過拉伸后直方圖變寬而且對比度明顯提高。
2 matlab實現直方圖拉伸
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');
Matlab實現彩色圖像拉伸
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實現灰度圖像拉伸
FPGA實現灰度圖像的拉伸可分為真拉伸和偽拉伸,真拉伸需要對圖像進行一幀的緩存,偽拉伸其實是在前一幀計算出最大和最后灰度級的基礎上完成當前圖像的拉伸處理,這樣比較節省資源。
1,計算灰度圖像的最大最小灰度級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
未經拉伸的圖像感覺蒙了一層霧,經過拉伸后圖像對比度明顯增強。
審核編輯:劉清
-
FPGA
+關注
關注
1626文章
21678瀏覽量
602040 -
matlab
+關注
關注
182文章
2963瀏覽量
230195
原文標題:基于FPGA的直方圖拉伸
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論