实用指南:FPGA学习笔记——图像处理之对比度调节(直方图均衡化)

news/2025/10/11 9:26:07/文章来源:https://www.cnblogs.com/ljbguanli/p/19134290

实用指南:FPGA学习笔记——图像处理之对比度调节(直方图均衡化)

目录

一、任务

二、直方图均衡化

三、代码

1.v文件

(1)RGB2YUV

(2)histogram_adjust

(3)equalization

(4)Histogram_top

2.仿真文件

(1)tb_his

(2)video_sour

四、实验现象


一、任务

将下面这幅图片进行对比度调节,用直方图均衡化。


二、直方图均衡化

第一步:计算原始直方图,统计每个灰度级 k 的像素数量:

第二步:计算归一化直方图(概率分布),M,N分别代表图像的长宽

第三步:计算累积分布函数(CDF),CDF 表示灰度值 ≤ k 的像素占比

第四步:计算均衡化后的灰度值,将 CDF 映射到 [0, 255] ,S(k) 是原始灰度 k 映射后的新灰度值。

RGB转YUV:

思路:先把RGB转成YUV(这里只涉及到了灰度),然后进行四个步骤(具体看代码)。


三、代码

1.v文件

(1)RGB2YUV

`timescale 1ns / 1ps
module RGB2YUV(
input         clk     ,
input         rst_n   ,
input [23:0]  i_rgb   ,
input         i_valid ,
input         i_hsync ,
input         i_vsync ,
output [7:0]  o_y     ,   //灰度值
output        o_valid ,
output        o_hsync ,
output        o_vsync
);
parameter C0 = 76 ,
C1 = 150,
C2 = 29 ;
reg [15:0] temp0_r;
reg [15:0] temp0_g;
reg [15:0] temp0_b;
reg [15:0] temp1_y;
reg [1:0] valid_reg;
reg [1:0] hsync_reg;
reg [1:0] vsync_reg;
always @(posedge clk)begin
if(!rst_n)begin
temp0_r <= 0;
temp0_g <= 0;
temp0_b <= 0;
end
else begin
temp0_r <= i_rgb[23:16]*C0;
temp0_g <= i_rgb[15:8]*C1;
temp0_b <= i_rgb[7:0]*C2;
end
end
always @(posedge clk)begin
if(!rst_n)
temp1_y <= 0;
else
temp1_y <= temp0_r + temp0_g + temp0_b;
end
always @(posedge clk)begin
valid_reg <= {valid_reg[0],i_valid};
hsync_reg <= {hsync_reg[0],i_hsync};
vsync_reg <= {vsync_reg[0],i_vsync};
end
assign o_y = temp1_y[15:8];
assign o_valid = valid_reg[1];
assign o_hsync = hsync_reg[1];
assign o_vsync = vsync_reg[1];
endmodule

(2)histogram_adjust

`timescale 1ns / 1ps
module histogram_adjust(
input         clk     ,
input         rst_n   ,
input [7:0]   i_y     ,
input         i_valid ,
input         i_hsync ,
input         i_vsync ,
//----输出统计结果------------------------------
output [19:0] o_histogram,
output reg    o_histogram_valid
);
reg [19:0] data [255:0] ;
reg [1:0]  vsync_reg    ;
reg [7:0]  addr;
integer i;
always @(posedge clk)begin
if(!rst_n || (~vsync_reg[0] && vsync_reg[1]))begin   //下降沿 对存储器清零
for(i=0; i < 256;i=i+1)begin
data[i] <= 0;
end
end
else if(i_valid)begin
data[i_y] <= data[i_y]+1;
end
end
always @(posedge clk)begin
vsync_reg <= {vsync_reg[0],i_vsync};
end
//---输出统计结果-----------------------------------
always @(posedge clk)begin
if(!rst_n || addr == 255)
o_histogram_valid <= 0;
else if(vsync_reg[0] && ~vsync_reg[1])   //上升沿
o_histogram_valid <= 1;
end
always @(posedge clk)begin
if(!rst_n)
addr <= 0;
else if(o_histogram_valid)begin
if(addr == 255)
addr <= 0;
else
addr <= addr+1;
end
end
assign o_histogram = data[addr];
endmodule

(3)equalization

`timescale 1ns / 1ps
module equalization(
input         clk     ,
input         rst_n   ,
input [7:0]   i_y     ,
input         i_valid ,
input         i_hsync ,
input         i_vsync ,
output [7:0]  o_y     ,
output reg    o_valid ,
output reg    o_hsync ,
output reg    o_vsync ,
//--灰度直方图统计结果-----------------------
input [19:0]  i_histogram,
input         i_histogram_valid
);
reg [19:0] data [255:0] ;
reg [7:0]  addr;
reg [19:0] equalization;
integer i;
always @(posedge clk)begin
if(!rst_n)
addr <= 0;
else if(i_histogram_valid)
addr <= addr+1;
end
always @ (posedge clk)begin
if(!rst_n )begin   //下降沿 对存储器清零
for(i=0; i < 256;i=i+1)begin
data[i] <= 0;
end
end
else if(i_histogram_valid) begin
if(addr == 0)
data[0] <= i_histogram;
else
data[addr] <= i_histogram+data[addr-1];   //当前输入值 + 加上上一次的总和
end
end
always @(posedge clk)begin
if(!rst_n)
equalization <= 0;
else
equalization <= data[i_y];
end
always @(posedge clk)begin
o_valid <= i_valid;
o_hsync <= i_hsync;
o_vsync <= i_vsync;
end
assign o_y =  equalization[19:12];
endmodule

(4)Histogram_top

`timescale 1ns / 1ps
module Histogram_top(
input           clk         ,
input           rst_n       ,
input   [23:0]  i_rgb       ,
input           i_vsync     ,
input           i_hsync     ,
input           i_valid     ,
output  [7:0]   o_y         ,
output          o_vsync     ,
output          o_hsync     ,
output          o_valid
);
wire [19:0] i_histogram;
wire    i_histogram_valid;
wire    [7:0]   y_o;
wire    o_valid_r;
wire    o_hsync_r;
wire    o_vsync_r;
RGB2YUV RGB2YUV_u(
. clk    (clk),
. rst_n  (rst_n),
. i_rgb  (i_rgb),
. i_valid(i_valid),
. i_hsync(i_hsync),
. i_vsync(i_vsync),
. o_y    (y_o),   //灰度值
. o_valid(o_valid_r),
. o_hsync(o_hsync_r),
. o_vsync(o_vsync_r)
);
histogram_adjust histogram_adjust_u(
. clk              (clk) ,
. rst_n            (rst_n) ,
. i_y              (y_o) ,
. i_valid          (o_valid_r) ,
. i_hsync          (o_hsync_r) ,
. i_vsync          (o_vsync_r) ,
. o_histogram      (i_histogram) ,
. o_histogram_valid(i_histogram_valid)
);
equalization equalization_u(
. clk              (clk) ,
. rst_n            (rst_n) ,
. i_y              (y_o) ,
. i_valid          (o_valid_r) ,
. i_hsync          (o_hsync_r) ,
. i_vsync          (o_vsync_r) ,
. o_y              (o_y) ,
. o_valid          (o_valid) ,
. o_hsync          (o_hsync) ,
. o_vsync          (o_vsync) ,
. i_histogram      (i_histogram) ,
. i_histogram_valid(i_histogram_valid)
);
endmodule

2.仿真文件

(1)tb_his

`timescale 1ns / 1ps
module tb_his();
reg clk = 0;
reg rst_n = 0;
wire [23:0] i_rgb;
wire        i_valid;
wire        i_vsync;
wire [7:0] o_y;
wire       o_valid;
always #10 clk = ~clk;
initial begin
#100 rst_n = 1;
end
Histogram_top Histogram_top_u(
.clk     (clk),
.rst_n   (rst_n),
.i_rgb   (i_rgb),
.i_valid (i_valid),
.i_hsync (),
.i_vsync (i_vsync),
.o_y     (o_y),   //灰度值
.o_valid (o_valid),
.o_hsync (),
.o_vsync ()
);
video_sour video_sour_u(
.pclk         (clk),
.rstn         (rst_n),
//----图像输出----------------------
.o_vs         (i_vsync),
.source_de_o  (i_valid),
.source_data_o(i_rgb),
//----图像输入----------------------
.de_i         (o_valid),
.data_i       ({o_y,o_y,o_y})
);
endmodule

(2)video_sour

`timescale 1ns / 1ps
`define VIDEO_1280_720
module video_sour#(
parameter   VSYNC=720,
HSYNC=1280,
DELAY1=50_000_000              //图像处理延迟
)(
input          pclk         ,
input          rstn         ,
//----图像输出----------------------
output  reg    o_vs         ,
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
// 场同步控制
always@(posedge pclk)
begin
if(cnt_v < V_SYNC_TIME) o_vs <= V_POLARITY;
else o_vs <= ~V_POLARITY;
end
endmodule


四、实验现象

均衡化之前:

均衡化之后:


以上就是图像处理之对比度调节(直方图均衡化)。(如果有错误的地方,还请大家指出来,谢谢!)

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

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

相关文章

第十二届行为与社会计算国际会议(BESC)暨2025年机器学习与社会计算国际研讨会(MLSC 2025)

第十二届行为与社会计算国际会议(BESC)暨2025年机器学习与社会计算国际研讨会(MLSC 2025) 2025 International Symposium on Machine Learning and Social Computing 2025年机器学习与社会计算国际研讨会(MLSC 20…

注解@RequestParam与@RequestBody的使用场景

一、前言 一直有这么一个疑问:在使用postman工具测试api接口的时候,如何使用 json 字符串传值呢,而不是使用 x-www-form-urlencoded 类型,毕竟通过 key-value 传值是有局限性的。假如我要测试批量插入数据的接口呢…

2025 最新推荐!大连深海原种海参源头厂家权威榜:聚焦全产业链优质供应商及选购指南青海淡干/青海围堰/青海圈养/青海吊笼/青海网箱/青海大棚海参厂家推荐

当前海参市场规模持续扩大,但行业乱象成为消费痛点:浅海养殖参冒充深海原种参、加工环节添加防腐剂、溯源体系缺失等问题频发,虚假宣传更让消费者难以辨别品质。随着 “自然鲜养 4.0 时代” 到来,消费者对 “高营养…

博客导航

做题记录 / 思考瓶颈目录(密码均为教练口头禅,\(^*\) 表示已公开,\(^\dag\) 表示已完结):Duel with StayAlone(决斗历史) \(^{*\dag}\)Hey Gift:逃亡公路(2023 年 NOIP 前杂题和互测题杂做) \(^{*\dag}\)Hey…

金碟KIS迷你版v12.0sp1注册补丁/金蝶迷你版破解

程序下载:https://www.123pan.com/s/OxpZVv-2MX8v.html 提取码:ZOBK 补丁下载:https://www.c5d.cn/thread-166-1-1.html声明:本程序收集于网络,仅供站内用户学习交流使用,商用后果自负,请在下载后24小时内自行删…

详细介绍:Hadess入门到实战(3) - 如何管理Npm制品

详细介绍:Hadess入门到实战(3) - 如何管理Npm制品pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

2025 年酒店一次性用品源头厂家最新推荐榜单:含牙签牙线筷子套杯盖等多品类品牌及配套能力与质检体系详解

在酒店行业持续发展的当下,一次性用品作为酒店服务的重要组成部分,其品质、供应效率及环保性直接影响酒店口碑与运营成本。然而当前市场上,部分厂家存在质检体系不完善、产品质量不稳定,配套能力弱导致酒店采购繁琐…

MP4和WMV2压缩机制对比 - 详解

MP4和WMV2压缩机制对比 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

Rokid JSAR开发:开发实现小游戏语音控制

@目录部署环境实战开发:分步骤实现:搭积木小游戏搭建基础项目结构积木逻辑语音控制总结 前言:Rokid JSAR 平台以其轻量化、高效率、易上手的特性,让开发者无需深入钻研复杂的底层技术,就能快速投身于 AR 应用的开…

2025 年餐饮一次性用品实力厂家最新推荐榜单:资质完备、口碑卓越的标杆企业权威甄选餐饮一次性牙签/牙线/筷子套/杯盖用品厂家推荐

当前餐饮行业快速发展,餐饮一次性用品作为餐饮经营中的重要配套物资,其品质、安全性与供应稳定性直接影响餐饮企业的运营效率和消费者信任度。然而,市场上餐饮一次性用品厂家数量众多,资质参差不齐,部分厂家存在原…

金蝶KIS专业版v12.3_破解补丁/金蝶KIS专业版v12.3下载

适用环境:金蝶KIS专业版v12.3发版日期:2013年07月01日安装程序:https://www.123684.com/s/OxpZVv-GzS8v安装程序:https://pan.xunlei.com/s/VOb65W6h1HXP7pn_BAwnJ6txA1?pwd=5fab# 补丁下载:https://www.c5d.cn/…

2025 年金属线槽厂家最新推荐排行榜:涵盖不锈钢 / 铝合金 / 防火 / 大跨距 / 喷塑类型,助您精准选优质厂家企业

在工业生产、建筑电气、数据中心建设等领域飞速发展的当下,金属线槽作为线缆保护与管理的关键设施,市场需求日益增长,但行业乱象却让采购者倍感困扰。市场上品牌繁杂,部分产品存在原材料劣质、工艺不达标等问题,抗…

金蝶KIS行政事业版v11.0免费补丁/行政事业版11破解版

软件名称:金蝶KIS行政事业版v11.0 发版时间:2014年10月 安装包地址:https://www.123pan.com/s/OxpZVv-2rX8v.html 提取码:BH97 补丁获取地址:https://www.c5d.cn/thread-218-1-1.html 声明:本程序收集于网络,仅供…

视觉异常检测系统的机器学习实践

本文详细介绍了一种基于机器学习的视觉异常检测系统,通过少量样本学习识别制造缺陷。系统利用模拟工厂环境收集数据,结合计算机视觉技术解决实际生产中的质量检测难题,涵盖数据收集、模型训练和实际应用等关键技术环…

2025 年最新电缆桥架厂家推荐排行榜:精选不锈钢 / 铝合金 / 热镀锌等多类型优质桥架厂家,助力高效选购热镀锌/热浸锌/托盘式/防火/喷塑电缆桥架厂家推荐

在现代建筑电气、工业自动化及数据中心等领域,电缆桥架作为核心基础设施,对线缆的承载、保护与管理起着关键作用。然而当前行业乱象频发,部分厂家用劣质原材料生产,导致桥架易腐蚀、断裂,引发安全隐患;产品质量参…

PK-CWT/600 罗氏线圈在高压输变电线路故障监测中的应用

一、产品特性概述 PK-CWT/600罗氏线圈拥有卓越的性能参数。其灵敏度高达0.05mV/A,能够敏锐地捕捉到微弱的电流变化;峰值电流可达到240kA,足以应对高压输变电线路中出现的大电流场景;di/dt为40kA/μs,对电流的瞬态…

金蝶店铺版v5.0.7安装包及店铺版v5.0.7破解补丁

金蝶KIS店铺版v5.0.7妙想版,网盘地址:https://www.123pan.com/s/OxpZVv-7Ys8v.html 金蝶KIS店铺版v5.0.7,网盘地址:https://www.123pan.com/s/OxpZVv-iGs8v.html 补丁下载:https://www.c5d.cn/thread-228-1-1.html声明…

Pycharm中使用git - 详解

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

模切 vs CO₂激光切割:非金属材料加工工艺终极对决,如何选择?-外协加工-委外加工-专注于河南郑州激光微纳代加工-激光切割雕刻打孔打标镭雕焊接划线表面处理-芯晨微纳(河南)光电科技有限公司

在广告标识、包装印刷、电子绝缘等非金属材料加工领域,模切与CO₂激光切割是两大主流工艺。二者并非简单的替代关系,而是各有其统治疆域。选择哪项技术,直接关系到企业的生产成本、效率上限和市场竞争力。本文将从七…

阵列信号处理波束形成

一、基础理论框架 1. 波束形成原理空间滤波本质:通过阵列单元信号加权叠加,增强目标方向信号增益,抑制干扰与噪声 关键参数:阵元间距(通常\(≤λ/2\)避免栅瓣) 波束指向角(\(θ=arcsin(λd/(2π))\)) 主瓣宽度…