FPGA ISP 算法模块实现(blc、bnr)
目录一、bayer格栅二、blc算法模块实现三、3✖3邻域生成四、中值滤波算法实现一、bayer格栅Bayer 格栅中文常译拜耳阵列或拜耳滤色镜英文 Bayer Pattern / Bayer CFA是当今绝大多数数码相机、手机摄像头 CMOS/CCD 传感器上覆盖的那层彩色滤光片阵列。摄像头数据以bayer格式通过mipi接口进去FPGA。bayer格式通常有四种RGGB、BGGR、GRBG、GBRG​。以RGGB为例其数据排布如下数据按行顺序从左往右传输。本文提到的算法都是对每个通道数据进行单独处理的数据传进FPGA后需要将其分配进不同通道。RGRGGBGBRGRGGBGB二、blc算法模块实现基础公式输出原始值-黑电平偏置module blc # (parameter DATAWIDTH12) ( input wire clk, input wire rst_n, input wire [DATAWIDTH-1:0] din, input wire din_vld, input wire [DATAWIDTH-1:0] blc_offset, output reg [DATAWIDTH-1:0] dout, output reg dout_vld ); localparam ONE512d1; localparam ZERO512d0; wire [DATAWIDTH:0] result_temp; wire [DATAWIDTH-1:0] result; //输入为raw12数据即12bit无符号数据如果校正后数据出现负值则将结果置零 assign result_temp {1b0,din}-{1b0,blc_offset}; assign result result_temp[12] ? ZERO[0:12]:result_temp; always (posedge clk or negedge rst_n) begin if (!rst_n) dout ZERO[0:12]; else if (din_vld) dout result; end always (posedge clk or negedge rst_n) begin if (!rst_n) dout_vld 1b0; else dout_vld din_vld; end endmodule三、3✖3邻域生成在图像处理算法中常对像素点及其邻域内的8个像素点进行处理图像数据串行出入要产生3✖3的滑窗可采用如下图所示的方案。四、中值滤波算法实现本文采用中值滤波作为bnr的降噪算法中值滤波会选取数字图像或数字序列中像素点及其周围临近像素点一共有奇数个像素点的像素值将这些像素值排序然后将位于中间位置的像素值作为当前像素点的像素值让周围的像素值接近真实值从而消除孤立的噪声点。从九个像素中获取中值的步骤1、找出每组3✖1数据的最大值中值最小值2、找出3个最大值中的最小值3个中值中的中值3个最小值的最大值3、找出最大值的最小值、中值的中值、最小值的最大值这三个数据的中值即为九个像素的中值。具体verilog代码如下所示cmp模块对3✖1数据进行排序bnr模块输出3✖3数据的中值。module cmp # (parameter DATAWIDTH12) ( input wire [DATAWIDTH-1:0] din1,din2,din3, output reg [DATAWIDTH-1:0] max,mid,min ); localparam ONE 512d1; localparam ZERO 512d0; wire flag1,flag2,flag3; assign flag1 din1din2; assign flag2 din1din3; assign flag3 din2din3; always (*) begin case ({flag1,flag2,flag3}) 3b000:begin maxdin3;middin2;mindin1;end 3b001:begin maxdin2;middin3;mindin1;end 3b010:begin maxdin2;middin1;mindin3;end 3b011:begin maxdin2;middin1;mindin3;end //din1din2 3b100:begin maxdin3;middin1;mindin2;end 3b101:begin maxdin3;middin2;mindin1;end 3b110:begin maxdin1;middin3;mindin2;end 3b111:begin maxdin1;middin2;mindin3;end default:begin maxZERO[DATAWIDTH-1:0]; midZERO[DATAWIDTH-1:0]; minZERO[DATAWIDTH-1:0]; end endcase end endmodulemodule bnr # (parameter DATAWIDTH12) ( input wire clk, input wire rst_n, input wire [DATAWIDTH-1:0] din1,din2,din3, input wire din_vld, output reg [DATAWIDTH-1:0] dout, output reg dout_vld ); localparam ONE 512d1; localparam ZERO 512d0; wire [DATAWIDTH-1:0] max1,mid1,min1; reg [1:0]vld_shift; reg [DATAWIDTH-1:0] max2,max3,mid2,mid3,min2,min3; wire [DATAWIDTH-1:0] max_min,mid_mid,min_max; wire [DATAWIDTH-1:0] mid; cmp #( .DATAWIDTH( DATAWIDTH ) )u_cmp1( .din1 ( din1 ), .din2 ( din2 ), .din3 ( din3 ), .max ( max1 ), .mid ( mid1 ), .min ( min1 ) ); always (posedge clk or negedge rst_n) begin if (!rst_n) vld_shift ZERO[1:0]; else if (din_vld) vld_shift {vld_shift[0],din_vld}; end always (posedge clk or negedge rst_n) begin if (!rst_n) begin max2 ZERO[DATAWIDTH-1:0]; mid2 ZERO[DATAWIDTH-1:0]; min2 ZERO[DATAWIDTH-1:0]; max3 ZERO[DATAWIDTH-1:0]; mid3 ZERO[DATAWIDTH-1:0]; min3 ZERO[DATAWIDTH-1:0]; end else if (din_vld) begin max2 max1; mid2 mid1; min2 min1; max3 max2; mid3 mid2; min3 min2; end end cmp #( .DATAWIDTH( DATAWIDTH ) )u_cmp2( .din1 ( max1 ), .din2 ( max2 ), .din3 ( max3 ), .min ( max_min) ); cmp #( .DATAWIDTH( DATAWIDTH ) )u_cmp3( .din1 ( mid1 ), .din2 ( mid2 ), .din3 ( mid3 ), .mid ( mid_mid) ); cmp #( .DATAWIDTH( DATAWIDTH ) )u_cmp4( .din1 ( min1 ), .din2 ( min2 ), .din3 ( min3 ), .max ( min_max) ); cmp #( .DATAWIDTH( DATAWIDTH ) )u_cmp5( .din1 ( max_min ), .din2 ( mid_mid ), .din3 ( min_max ), .mid ( mid) ); always (posedge clk or negedge rst_n) begin if (!rst_n) dout ZERO[DATAWIDTH-1:0]; else if (din_vld vld_shift[1]) dout mid; end always (posedge clk or negedge rst_n) begin if (!rst_n) dout_vld 1b0; else dout_vld din_vld vld_shift[1]; end endmodule

相关新闻

【具身智能仿真平台实战:MuJoCo从入门到精通】第16章 高级主题

【具身智能仿真平台实战:MuJoCo从入门到精通】第16章 高级主题

在前面的章节中,我们已经掌握了 MuJoCo 的基础建模、控制、传感器和 ROS 集成。本章将探索一些更高级的主题,帮助你扩展仿真的能力边界:软体仿真、流体与颗粒近似、生物力学肌肉模型、多体动力学理论以及 MuJoCo 源码结构。这些内容为进一步的研究和工程实践提供方向。所有示…

2026/9/3 5:43:32 阅读更多 →
STM32单片机实战教程:从零基础到项目开发的系统学习指南

STM32单片机实战教程:从零基础到项目开发的系统学习指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 5:43:32 阅读更多 →
三极管级联放大电路快速分析法:从原理到实战设计指南

三极管级联放大电路快速分析法:从原理到实战设计指南

这次我们来看一个电子工程师和硬件爱好者绕不开的经典问题:如何快速分析三极管级联放大电路。无论是设计音频放大器、传感器前端,还是调试单片机驱动电路,多级放大器的分析常常让人头疼。复杂的直流偏置、相互耦合的交流信号、以及整体增益和…

2026/9/3 5:42:32 阅读更多 →

最新新闻

车辆目标检测实战:1880张7类数据集与YOLOv8训练全流程

车辆目标检测实战:1880张7类数据集与YOLOv8训练全流程

简介:本资源是面向计算机视觉初学者与目标检测实践者的高质量车辆细粒度分类数据集,专为训练和验证YOLO、Faster R-CNN等主流检测模型设计,覆盖城市交通监控、智能安防、特种车辆识别等典型应用场景。压缩包共2000个文件,含1883张…

2026/9/3 6:19:51 阅读更多 →
STM32老人防摔倒检测系统设计与OneNet云对接

STM32老人防摔倒检测系统设计与OneNet云对接

简介:本资源是一套基于STM32平台开发的老人防摔倒智能报警系统完整工程,面向嵌入式初学者、物联网课程设计者及智能健康硬件开发者,聚焦居家养老场景下的实时跌倒识别与应急联动需求。系统以STM32F103为主控,集成MPU6050姿态检测、…

2026/9/3 6:19:51 阅读更多 →
EazySpeezy:讽刺速成文化的交互模拟器与信息伦理反思

EazySpeezy:讽刺速成文化的交互模拟器与信息伦理反思

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 6:19:51 阅读更多 →
Termux手机端Java项目一键构建Shell脚本实战

Termux手机端Java项目一键构建Shell脚本实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 6:19:51 阅读更多 →
源码包安装Nginx后补充编译模块功能

源码包安装Nginx后补充编译模块功能

目录 问题背景 操作步骤说明 STEP-1、确认之前安装究竟编译了哪些模块 STEP-2、来到之前上传的软件源码包目录下补充编译选项 STEP-3、热替换 nginx 二进制(不停机升级,业务不中断) 问题背景 之前使用源码包方式在Linux的系统环境内&…

2026/9/3 6:19:51 阅读更多 →
Python爬虫与数据分析实战:豆瓣电影数据采集与可视化系统构建

Python爬虫与数据分析实战:豆瓣电影数据采集与可视化系统构建

简介:本资源是一套完整可用的毕业设计项目源码,面向计算机及相关专业本科生,专为毕业设计、课程设计或期末大作业打造,解决影视数据采集、清洗、分析与可视化全流程实践难题。压缩包共111个文件,含5个核心Python爬虫与…

2026/9/3 6:18:50 阅读更多 →

日新闻

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

先别急着点开,这不是劝退文,而是想讲清楚一件事:用 AI 做逆向值不值得学?如果要用,怎么搭一套“V8 环境 AI 智能体”来提升效率。最近逆向圈、爬虫圈都在聊 AI Agent、AST 工程逆向、JS 逆向这些词,很多新手…

2026/9/3 0:00:29 阅读更多 →
安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 0:00:29 阅读更多 →
ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 0:00:29 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/9/3 4:22:22 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/9/3 4:22:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/9/3 4:22:59 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/3 4:17:49 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/3 4:18:56 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/3 4:21:44 阅读更多 →