• FPGA实现图像对比度自动调整,提供2套工程源码和技术支持


    1.算法原理介绍

    使用直方图均衡技术实现
    使用直方图均衡技术将原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布,是一种常用的图像增强方法。
    处理过程如下:
    在这里插入图片描述
    首先,我们需要将RGB888图像转化为YCrCb,统计当前Y分量直方图分布(应用于下一帧),并通过上一帧的统计数据均衡化当前 Y 分量,再转换回RGB888并输出。

    2.HLS算法实现

    算法采用HLS实现,处理流程部分代码如下:

    #pragma HLS dataflow
    	hls::AXIvideo2Mat(src_axi, img1);
    	Cvt_RGB_to_YCrCb(img1, img2);
    	dualAryEqualize<HLS_8UC3, HLS_8UC3, IMG_MAX_HEIGHT, IMG_MAX_WIDTH, 256>(img2, img3, adj);
    	Cvt_YCrCb_to_RGB(img3, img5);
    	hls::Mat2AXIvideo(img5, dst_axi);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    需要完整HLS代码的兄弟可以看完文章后再最后的福利章节得到源码的获取渠道;
    HLS综合后的延时和逻辑资源占用统计如下:
    在这里插入图片描述
    HLS综合编译后,即可到处RTL得到HLS的IP核,可在vivado中直接调用;

    3.工程1介绍:zynq7100实现

    开发板:zynq7100开发板;
    开发环境:vivado2019.1;
    输入:OV5640摄像头,输入分辨率1280X720;
    输出:HDMI,输出分辨率1280X720;
    工程BD如下:
    在这里插入图片描述
    代码架构如下:
    在这里插入图片描述
    SDK主函数代码如下:

    #include "I2C_16bit.h"
    #include "xiicps.h"
    #include "xil_io.h"
    #include "xparameters.h"
    #include "helai_vdma.h"
    #include "xcontrastadj.h"
    #include "xil_cache.h"
    
    XIicPs	Iic;
    XContrastadj contrastadjadjInstance;
    
    void main(){
    	I2C_config_init();
    	XContrastadj_Initialize(&contrastadjadjInstance, XPAR_CONTRASTADJ_0_DEVICE_ID);
    	XContrastadj_EnableAutoRestart(&contrastadjadjInstance);
    	//XContrastadj_Set_adj(&contrastadjadjInstance, 50);
    	XContrastadj_Start(&contrastadjadjInstance);
    	helai_vdma();
    	while(1);
    
    	while(1){
    		for(int adj=0; adj<=100; adj++){
    			XContrastadj_Set_adj(&contrastadjadjInstance, adj);
    			usleep(100000);
    		}
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    可以在while(1)死循环里自动调整对比度;
    也可以使用XContrastadj_Set_adj(&contrastadjadjInstance, 50)单独调整对比度,这里的入口参数 50即为自定义设置的对比度;

    4.工程2介绍:Kintex7实现

    开发板:Kintex7开发板;
    开发环境:vivado2019.1;
    输入:OV5640摄像头,输入分辨率1280X720;
    输出:HDMI,输出分辨率1280X720;
    工程BD如下:
    在这里插入图片描述
    代码架构如下:
    在这里插入图片描述
    SDK主函数代码如下:

    #include 
    #include "xgpio.h"
    #include "oak_iic.h"
    #include "unistd.h"
    #include "helai_vdma.h"
    #include "helai_color_back.h"
    #include "xcontrastadj.h"
    
    XGpio_Config *XGpioCfg;
    XGpio led_gpio;
    XContrastadj contrastadjadjInstance;
    
    #define	AXI_GPIO_DEVICE_ID	XPAR_GPIO_0_DEVICE_ID
    
    int main(){
    	XGpioCfg = XGpio_LookupConfig(AXI_GPIO_DEVICE_ID);
    	XGpio_CfgInitialize(&led_gpio, XGpioCfg, XGpioCfg->BaseAddress);
    	XGpio_SetDataDirection(&led_gpio, 1, 0);	//output
    	XGpio_DiscreteWrite(&led_gpio, 1, 0);
    	oak_i2c_init(OV5640_IIC_BASEADDR, 1000000, 0x78>>1, IIC_REG_LEN16, IIC_DATA_LEN8);
    	OV5640_Init(OV5640_IIC_BASEADDR,1280,720);
    	XContrastadj_Initialize(&contrastadjadjInstance, XPAR_CONTRASTADJ_0_DEVICE_ID);
    	XContrastadj_EnableAutoRestart(&contrastadjadjInstance);
    	XContrastadj_Set_adj(&contrastadjadjInstance, 100);
    	XContrastadj_Start(&contrastadjadjInstance);
    	helai_vdma();
    	while(1){
    		usleep(500000);
    		XGpio_DiscreteWrite(&led_gpio, 1, 1);
    		usleep(500000);
    		XGpio_DiscreteWrite(&led_gpio, 1, 0);
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    5.上板调试验证

    工程1开发板连接如下:
    在这里插入图片描述
    工程2开发板连接如下:
    在这里插入图片描述

    下面给出不同对比度的输出效果:
    设置对比度为0时的输出效果如下:
    在这里插入图片描述
    可以看到画面除白色衣区域外其他部分较暗;
    设置对比度为50时的输出效果如下:
    在这里插入图片描述
    可以看到画面整体变得更亮,白色衣服更白,左边的书籍堆放区也亮了很多;
    设置对比度为100时的输出效果如下:
    在这里插入图片描述
    可以看到图像更加敞亮,甚至有点刺眼了。。。

    6.福利:工程源码获取

    福利:工程代码的获取
    代码太大,无法邮箱发送,以某度网盘链接方式发送,
    资料如下:获取方式:私,或者文章末尾的V名片。
    在这里插入图片描述

  • 相关阅读:
    PAM从入门到精通(二十四)
    C#文件目录
    ChinaSkills-高职组网络系统管理大赛-WinSer 2019 互联网网卡检测服务笔记
    【图像处理 】卡尔曼滤波器原理
    宏任务、微任务,怎么执行的
    每日一题:web常见的攻击方式有哪些?如何防御?
    macOS下 /etc/hosts 文件权限问题修复方案
    无网络情况下,如何使用Docker镜像安装软件?
    没有五十瓶红牛我是不会告诉你——面试中应该如何正确谈薪
    华为机试 - 最大括号深度
  • 原文地址:https://blog.csdn.net/qq_41667729/article/details/128096508