目录
0 引言
最近项目中需要用到二维Gamma校正(基于二维伽马函数的光照不均匀图像自适应校正算法),且需要在嵌入式设备上运行,因此需要用C语言实现该功能。经过一番查找,仅找到基于OpenCV版和matlab版的该功能的实现,由于matlab使用更为方便,故决定采用matlab实现该功能,待在PC上完成测试后,再在matlab版本基础上改为C语言版。
已有matlab版二维Gmama校正代码的实现主要利用了两个关键函数:fspecial函数生成高斯卷积核、imfilter函数对图片做卷积运算。考虑到嵌入式设备中并无相应函数库,故需要手动实现上述两个函数,实现如下。
1、思路
(1)卷积核生成:根据输入卷积核尺寸(奇数)创建卷积核矩阵,随后确定矩阵中心点,将输入的标准差及各点相对中心点坐标(以中心点为原点建立直角坐标系)带入二维高斯函数可得该点值。
值得注意的是:在上述步骤完成后还需要进行归一化,确保卷积核所有点的值和为1,具体步骤为:求得所有点值之和sum,各点值分别除以sum即可得最终卷积核。
例:生成尺寸为3*3,标准差为2的卷积核
图2.1 未做归一化时的卷积核 图2.2 归一化完成后的卷积核
(2)卷积运算:对全图进行遍历,利用卷积核对各点进行卷积运算,当卷积核部分超出原始图片区域时,超出部分补为最近的图片边界值。
注:matlab库中imfilter函数有三个重要参数,分别为填充选项、输出大小、相关性和卷积选项。其中,本文实现的imfilter函数的填充策略同原库函数中'replicate'选项。
2、代码
2.1 fspecial函数实现代码
%=======================================================
%fspecial函数实现(参数为'gaussian')
%作者:Usetc-Sl
%版本:v1.0
%创建日期:2021.04.28
%输入