完整教程:FPGA学习笔记——图像处理之亮度调节(Gamma)

news/2025/10/9 18:46:31/文章来源:https://www.cnblogs.com/ljbguanli/p/19131753

完整教程:FPGA学习笔记——图像处理之亮度调节(Gamma)

目录

一、任务

二、Gamma

1.表达式

三、代码

1.v文件

(1)gamma_adjust.v

(2)gamma.v

2.仿真文件

(1)tb.v

(2)video_source.v

四、实验现象


一、任务

将下面这幅图片进行亮度调节,用gamma来校正亮度调节。


二、Gamma

        Gamma校正是一种非线性亮度调整技术(一定程度上还能够调节对比度),通过对图像像素值进行律变换,校正显示系统的非线性响应特性。其数学表达式为:

1.表达式

Vout = Vin^γ
Vin:输入亮度值(归一化到0-1
Vout:输出亮度值
γGamma):校正系数
CRT/LCD等显示设备的亮度响应天生就是非线性的(近似γ≈2.2),需要进行补偿。

思路:根据表达式,γ是近似2.2,这里就可以有两种方法:1.把2.2约等于2(我这里就是这种做法)2.将0~255的2.2次方做成查找表(用AI生成)。

方法一:将输入的值平方以后,再除以255,得到调整后的图像数据。

方法二:将输入的值,在查找表里面查找,是哪个值就输出那个处理后的值。


三、代码

1.v文件

(1)gamma_adjust.v

`timescale 1ns / 1ps
module gamma_adjust(
input             clk         ,
input             rst_n       ,
input      [7:0]  i_rgb888    ,
output reg [7:0]  o_rgb888
);
reg     [15:0]  product ;
reg [7:0]   lut [255:0] ;
always @(posedge clk) begin
if(!rst_n)
product <= 0;
else
product <= (i_rgb888 * i_rgb888)/255;
end
always@(posedge clk) begin
if(!rst_n)
o_rgb888 <= 0;
else
o_rgb888 <= product[7:0];
end
endmodule

(2)gamma.v

`timescale 1ns / 1ps
module gamma(
input           clk         ,
input           rst_n       ,
input   [7:0]   scale       ,
input   [23:0]  i_rgb888    ,
input           i_vsync     ,
input           i_hsync     ,
input           i_vaild     ,
output  [23:0]  o_rgb888    ,
output          o_vsync     ,
output          o_hsync     ,
output          o_vaild
);
reg [1:0]   i_vsync_r;
reg [1:0]   i_hsync_r;
reg [1:0]   i_vaild_r;
//红色
gamma_adjust gamma_adjust_u1(
.  clk        (clk),
.  rst_n      (rst_n),
.  i_rgb888   (i_rgb888[23:16]),
.  o_rgb888   (o_rgb888[23:16])
);
//绿色
gamma_adjust gamma_adjust_u2(
.  clk        (clk),
.  rst_n      (rst_n),
.  i_rgb888   (i_rgb888[15:8]),
.  o_rgb888   (o_rgb888[15:8])
);
//蓝色
gamma_adjust gamma_adjust_u3(
.  clk        (clk),
.  rst_n      (rst_n),
.  i_rgb888   (i_rgb888[7:0]),
.  o_rgb888   (o_rgb888[7:0])
);
//同步打拍,否则图像会平移
always @(posedge clk) begin
i_vsync_r <= {i_vsync_r[0],i_vsync};
i_hsync_r <= {i_hsync_r[0],i_hsync};
i_vaild_r <= {i_vaild_r[0],i_vaild};
end
assign o_vsync = i_vsync_r[1];
assign o_hsync = i_hsync_r[1];
assign o_vaild = i_vaild_r[1];
endmodule

2.仿真文件

(1)tb.v

`timescale 1ns / 1ps
module tb();
reg clk = 0;
reg rst_n = 0;
wire  [23:0]  i_rgb888;
wire  [23:0]  o_rgb888;
wire    i_vaild;
wire    o_vaild;
always #10 clk = ~clk;
initial begin
#100;
rst_n = 1;
end
gamma gamma_u(
. clk      (clk)   ,
. rst_n    (rst_n)   ,
. scale    (140)   ,
. i_rgb888 (i_rgb888)   ,
. i_vsync  ()   ,
. i_hsync  ()   ,
. i_vaild  (i_vaild)   ,
. o_rgb888 (o_rgb888)   ,
. o_vsync  ()   ,
. o_hsync  ()   ,
. o_vaild  (o_vaild)
);
video_source video_source_u(
.         pclk      (clk)   ,
.         rstn      (rst_n)  ,
//----图像输出----------------------
. source_de_o (i_vaild) ,
. source_data_o (i_rgb888),
//----图像输入----------------------
.  de_i        (o_vaild) ,
.  data_i       (o_rgb888)
);
endmodule

(2)video_source.v

`timescale 1ns / 1ps
`define VIDEO_1280_720
module video_source#(
parameter   VSYNC=720,
HSYNC=1280,
DELAY1=50_000_000              //鍥惧儚澶勭悊寤惰繜
)(
input          pclk         ,
input          rstn         ,
//----鍥惧儚杈撳嚭----------------------
output  reg    source_de_o  ,
output [23:0]  source_data_o,
//----鍥惧儚杈撳叆----------------------
input          de_i         ,
input [23:0]   data_i
);
//1280X720 74.25MHZ
`ifdef  VIDEO_1280_720
parameter  H_ACTIVE 		= 1280;// 琛屾暟鎹湁鏁堟椂闂?
parameter  H_FRONT_PORCH 	= 110; // 琛屾秷闅愬墠鑲╂椂闂?
parameter  H_SYNC_TIME 		= 40;  // 琛屽悓姝ヤ俊鍙锋椂闂?
parameter  H_BACK_PORCH 	= 220; // 琛屾秷闅愬悗鑲╂椂闂?
parameter  H_POLARITY       = 1;   // 琛屽悓姝ユ瀬鎬?
parameter  V_ACTIVE 		= 720; // 鍒楁暟鎹湁鏁堟椂闂?
parameter  V_FRONT_PORCH 	= 5;   // 鍒楁秷闅愬墠鑲╂椂闂?
parameter  V_SYNC_TIME  	= 5;   // 鍒楀悓姝ヤ俊鍙锋椂闂?
parameter  V_BACK_PORCH 	= 20;  // 鍒楁秷闅愬悗鑲╂椂闂?
parameter  V_POLARITY       = 1;   // 鍦哄悓姝ユ瀬鎬?
`endif
localparam addr_size=HSYNC*VSYNC*3+54;    //鎬诲瓧鑺傛暟
//鏂囦欢鍚?
integer bmp_file_id;
integer bmp_dout_id;
//鏂囦欢鍙ユ焺
integer h;
reg		[7:0]	rd_data  [addr_size-1:0];      //鏍规嵁鑷繁鍥剧墖澶у皬    BMP鏍煎紡涓猴細浣嶅浘鏂囦欢澶达紙14瀛楄妭锛?+浣嶅浘淇℃伅澶达紙40瀛楄妭锛?+瀹為檯鍍忕礌鐐瑰崰鍐呭瓨
reg		[7:0]	wr_data  [addr_size-1:0];
integer i=0;
integer    addr_rd=54;
integer    addr_wr=54;
initial begin
bmp_file_id = $fopen("D:/intelFPGA_lite/haiyunjiexun/text_Vivado/image_isp/image_1.bmp","rb");          //鎵撳紑鍘熷鍥惧儚
bmp_dout_id = $fopen("D:/intelFPGA_lite/haiyunjiexun/text_Vivado/image_isp/image_1_out.bmp","wb");     //鎵撳紑杈撳嚭鍥惧儚
h = $fread(rd_data,bmp_file_id);                                   //璇诲彇bmp鏂囦欢     璇诲彇鍒扮殑鏁版嵁灏嗕細渚濇鏀惧叆rd_data涓?
$fclose(bmp_file_id);                                              //璇诲彇瀹屾瘯
#DELAY1  ;                                                             //鍥惧儚澶勭悊寤惰繜
for(i = 0; i = addr_size-3)
addr_rd= addr_size-3)
addr_wr (H_SYNC_TIME + H_BACK_PORCH -1)) &&   (cnt_h  (V_SYNC_TIME + V_BACK_PORCH-1)) && (cnt_v <= (V_SYNC_TIME + V_BACK_PORCH + V_ACTIVE-1)))
source_de_o<=1;
else
source_de_o<=0;
end
always@(posedge pclk)begin
if(!rstn)
cnt_h<=0;
else if(cnt_h == H_TOTAL_TIME-1)
cnt_h<=0;
else
cnt_h<=cnt_h+1;
end
always@(posedge pclk)begin
if(!rstn)
cnt_v<=0;
else if(cnt_h == H_TOTAL_TIME-1)begin
if(cnt_v == V_TOTAL_TIME-1)
cnt_v<=0;
else
cnt_v<=cnt_v+1;
end
end
endmodule

四、实验现象


以上就是图像增强之亮度调节(Gamma)。(如果有错误的地方,还请大家指出来,谢谢!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/933780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes Ingress:管理集群外部访问的入口网关

在k8s之服务Service章节,我们详细的介绍了Service的组成以及相关的原理。Service可以将自身的服务暴露出去,给集群内部服务或者给外部服务去使用,或者将外部服务分装为一个service,供给集群内部服务使用。而今天介…

搜索选讲

前言 我太菜了,如有没写清楚的地方大家轻喷. 爆搜 P4467 k短路 Hint:沿用次短路的思路(P1491). 不能经过重复的点是一个很强的限制,直接搜无论怎么剪枝都会被卡爆. 由于没有负权边,最短路必然不会经过重复的点,…

深入解析:在Linux中部署tomcat

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

vue打包的项目,从根目录进去路由可访问,浏览器直接打开这个路由不可访问

Vue 项目路由访问问题分析 您描述的问题是 Vue 打包后的项目在直接访问子路由时出现 404 错误,而从首页导航可以正常访问。这是一个常见的 Vue 路由配置问题。 问题原因 这是因为您使用的是 Vue Router 的 history 模…

深入解析:Docker容器化部署简要指南

深入解析:Docker容器化部署简要指南2025-10-09 18:29 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…

IObit Uninstaller一款强大的卸载工具!IObit Uninstaller卸载工具,IObit Uninstaller下载安装教程

软件介绍 IObit Uninstaller 是一款强大且实用的卸载工具。它能有效替代 Windows 自带卸载功能,,不残留相关文件与注册表信息,防止因残留导致系统变慢或出错。软件支持多种卸载方式,常规卸载适用于大多数程序;批量…

网络配置不再难:4G/Wi-Fi/以太网/虚拟网卡全指南

多种网络接口并存的时代,掌握4G、Wi-Fi、以太网和虚拟网卡的配置是必备技能。本文系统讲解各类连接方式的设置方法,助你轻松应对复杂网络场景。 网络适配器,它的一个更广为人知的名字是——网卡。 在应用开发中我们…

2025开关按钮厂家最新推荐榜:开关按钮,带灯开关按钮,防水开关按钮,防爆开关按钮,防腐开关按钮等全种类覆盖,高品质设计与卓越性能口碑之选

在当今科技飞速发展的时代,开关按钮作为各种电子设备、电气系统中不可或缺的基础元件,其重要性不言而喻。无论是工业自动化生产线上的精密控制设备,还是日常生活中的家用电器,开关按钮都在默默地发挥着关键作用。随…

一种排查java.lang.OutOfMemoryError: Metaspace的方法

有现场反应k8s中的java应用出现java.lang.OutOfMemoryError: Metaspace,但是没有提供hprof转储文件,所以本地排查该问题。 Metaspace区域的内存溢出错误,通常意味着 JVM 中加载的类元数据超出了限制。 jstat -class…

MDX Blog Post

Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).:::tipUse the power of React to create interactive blog posts....Blog …

Long Blog Post

This is the summary of a very long blog post,Use a `` comment to limit blog post size in the list view.This is the summary of a very long blog post,Use a `` comment to limit blog post size in the list …

First Blog Post

Lorem ipsum dolor sit amet...Lorem ipsum dolor sit amet......consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolo…

本站点即将在2025年改变研究方向和目标

由于当前部分社区发展已经朝向不可控领域,以及流浪的猎人计划做一些其他的东西,预计会在今年内开始对该站点的研究方向进行一些改变。 我们会在未来降低一些特定技术研究的公开,如果一些东西最后公开出来变成了“外…

详细介绍:内置高压MOS的智能调光方案:AP5126 LED降压恒流驱动芯片

详细介绍:内置高压MOS的智能调光方案:AP5126 LED降压恒流驱动芯片pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…

实用指南:12_OkHttp初体验

实用指南:12_OkHttp初体验pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

深入解析:llm的ReAct

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

(AE)Adobe After Effects 2025 视频后期制作软件!安装包永久免费免激H解锁版下载与图文详细安装教程!!

软件介绍 Adobe After Effects 2025 作为一款专业的动态图形与视觉特效软件,在影视后期制作领域地位显著。它提供了丰富且强大的功能,能助力创作者将创意变为现实。它支持2D及3D动画,透过图层控制音频与视频合成效果…

Postgresql主从配置

主从机器先安装Postgresql 安装postgresql: postgresql 最新版 sudo sh -c echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list wg…

乒乓球

练习正手乒乓球

2025年工程管理软件系统推荐榜:交付管理/工程协同/工程管理/智慧工地管理系统

数字化浪潮下,一款合适的工程管理软件正成为项目高效推进的重要支柱。工程管理软件系统作为建筑行业数字化转型的核心工具,近年来在AI、大数据、BIM等技术的推动下迎来快速发展。根据行业报告显示,国内中小建筑企业…