0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA的直方图拉伸方案

FPGA之家 来源:FPGA开源工作室 2023-05-04 09:38 次阅读

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)

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

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

如上图所示,上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');

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

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
    +关注

    关注

    1629

    文章

    21729

    浏览量

    602986
  • matlab
    +关注

    关注

    185

    文章

    2974

    浏览量

    230384

原文标题:基于FPGA的直方图拉伸

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于直方图算法进行FPGA架构设计

    引言 直方图统计在图像增强和目标检测领域有重要应用,比如直方图均衡,梯度直方图直方图的不同种类和统计方法请见之前的文章。本章就是用FPGA
    的头像 发表于 12-10 16:37 2786次阅读

    FPGA直方图处理方法

    图像直方图用作数字图像中色调分布的图形表示。它绘制了每个色调值的像素数。通过查看特定图像的直方图,观看者将能够一目了然地判断整个色调分布。
    的头像 发表于 12-15 09:20 1057次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>直方图</b>处理方法

    一文带你了解FPGA直方图操作

    灰度变换等处理过程。 而FPGA对于直方图处理主要分为以下三种: 我们常见或者听说的直方图概念主要指直方图均衡,这也是最简单的一种方式,常见某些入门级的图像处理书籍或者文章。
    发表于 01-10 15:07

    DSP国产教学实验箱_嵌入式教程:5-7 直方图均衡化

    对比度增强方法。直方图拉伸直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸直方图进行调整,从而“扩大”前景和背景
    发表于 07-12 15:47

    图像自适应分段线性拉伸算法的FPGA设计

    。1 自适应线性分段线性灰度级拉伸算法首先对红外图像做灰度直方图统计,低信噪比条件下,选取压缩因子为5%,将盲元和噪声的影响降到最低。分别搜索5%最大灰度值中的最小值作为Xmax,5%最小灰度值里
    发表于 04-27 14:37

    基于FPGA的HDTV视频图像灰度直方图统计算法设计

    亮度分布特性有力的工具,根据它的结果可以进行诸如灰度拉伸、自动对比度、动态伽马调整等操作。图1 Lena 图像的灰度直方图统计FPGA算法统计在计算机或者DSP 上实现直方图统计时,我
    发表于 05-14 12:37

    FPGA图像处理 直方图统计并灰度拉伸 然后VGA显示的问题

    本人目前用FPGA做一个图像处理并VGA显示的东西,中间用到直方图统计并灰度拉伸,使图像对比度提高。现在遇到一个问题,取统计的5%和95%的灰度值作为阈值,当当前像素值来到的时候,以当前灰度值做一个
    发表于 06-28 09:35

    基于FPGA的图像直方图实时显示

    ``基于FPGA的图像直方图实时显示 AT7_Xilinx开发板(USB3.0+LVDS)资料共享 腾讯链接:https://share.weiyun.com/5GQyKKc 百度网盘链接
    发表于 07-12 17:33

    基于FPGA的图像直方图均衡处理

    `基于FPGA的图像直方图均衡处理 AT7_Xilinx开发板(USB3.0+LVDS)资料共享 腾讯链接:https://share.weiyun.com/5GQyKKc 百度网盘链接:https
    发表于 07-14 17:26

    TI C6000教学实验箱操作教程:5-8 直方图均衡化(LCD显示)

    是间接对比度增强方法。直方图拉伸直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸直方图进行调整,从而“扩大”前景
    发表于 12-07 14:20

    基于直方图变换的LED背光源节电调光方法

    摘要: 背光源的功耗最高可占液晶显示模组总功耗的50%以上,文章提出一种基于直方图变换的背光源节电调光方法,在ARM 平台上通过直方图的裁剪、搬移和拉伸对图像进行处理,其后
    发表于 07-19 15:41 2614次阅读
    基于<b class='flag-5'>直方图</b>变换的LED背光源节电调光方法

    基于直方图算法的FPGA设计架构

    直方图统计在图像增强和目标检测领域有重要应用,比如直方图均衡,梯度直方图直方图的不同种类和统计方法请见之前的文章。本章就是用FPGA来进行
    发表于 04-20 10:47 1190次阅读
    基于<b class='flag-5'>直方图</b>算法的<b class='flag-5'>FPGA</b>设计架构

    剖析FPGA灰度直方图线性拉伸

    纯工程师社群 直方图线性拉伸相对于直方图均衡化来说就更好理解一些了,即用线性变化将灰度直方图较窄的部分拉伸至整个区间,增强整幅图像的对比度。
    的头像 发表于 07-02 10:37 3129次阅读
    剖析<b class='flag-5'>FPGA</b>灰度<b class='flag-5'>直方图</b>线性<b class='flag-5'>拉伸</b>

    基于FPGA直方图线性拉伸的解决方案与对比分析

    但是实际应用中并不会直接采用上述的A和B,这是由于图像中可能存在噪声的原因。想象如果图像中存在几个纯白点(255)和纯黑点(0),那么拉伸后的效果就无法达到预期。
    的头像 发表于 07-02 10:38 2237次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>直方图</b>线性<b class='flag-5'>拉伸</b>的解决<b class='flag-5'>方案</b>与对比分析

    基于FPGA灰度直方图线性拉伸

    但是实际应用中并不会直接采用上述的A和B,这是由于图像中可能存在噪声的原因。想象如果图像中存在几个纯白点(255)和纯黑点(0),那么拉伸后的效果就无法达到预期。
    的头像 发表于 06-08 10:15 2471次阅读