11

健康奶 · 2023年07月09日 · 北京市

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

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);

需要完整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);
        }
    }

}

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

4.工程2介绍:Kintex7实现

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

#include <stdio.h>
#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);
    }
}

5.上板调试验证

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

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

6.福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以百度网盘链接方式发送,
通过微信获取资料:
微信图片_20230604203730.jpg
资料如下:
在这里插入图片描述

推荐阅读
关注数
12
内容数
112
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息