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.福利:工程源码获取

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

9527华安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值