一种基于Python插值的图像修正方法与流程

文档序号:32305246发布日期:2022-11-23 09:46阅读:167来源:国知局
一种基于Python插值的图像修正方法与流程
一种基于python插值的图像修正方法
技术领域
1.本发明属于图像处理技术领域,尤其涉及一种基于python插值的图像修正方法。


背景技术:

2.摄像头拍摄的图像的边缘部分存在阴影,通常需要对阴影部分进行修正,使得边缘部分尽可能与其他部分保持一样的亮度,在此过程中需要使用插值算法。网格插值算法是一种常用的图像处理技术,不同的编程语言会有不同的实现方式,支持的程度也不同,比如matlab的网格插值算法既支持外插值又支持内插值,而python的网格插值算法仅仅支持内插值,对于fov(视场角)特别大的摄像头,我们常常需要去除图像边缘角落,此时将边缘的数据设置为nan,对于这种情况,当我们将matlab程序的运行结果和相应的python程序的运行结果比较,如果算法用到网格插值,两者的结果有可能会有很大差异,由于python对网格外插值算法和处理nan不够完善,导致结果不是很准。


技术实现要素:

3.本发明提供一种基于python插值的图像修正方法,弥补了python中griddata不支持外插值的缺陷。
4.本发明提供的基于python插值的图像修正方法,包括:
5.(1)对原始图像进行采样,从图像中筛选出非nan位置,采用python的griddata插值算法对非nan位置形成的非nan区域进行插值;
6.(2)从经过步骤(1)插值后的数据中筛选出nan位置,采用python的rbf插值算法对nan位置形成的nan区域进行插值;
7.(3)从经过两次插值后的数据中筛选出nan位置,将nan位置的数据置为nan;根据第二次插值后获得的数据构建修正矩阵,根据修正矩阵对原始图像进行阴影修正,修正矩阵中的数据为nan表示无需对原始图像的相应位置进行阴影矫正。
8.优选地,所述步骤(1)具体为:对原始图像按照块进行下采样后取平均值,得到缩略图,然后将缩略图中的每个像素值除以缩略图中像素最大的数值,得到该块的基础数据shading;从基础数据shading中筛选出非nan位置,建立插值函数z2=f(axisx2,axisy2),其中,z2为非nan的位置的像素数值,axisx2、axisy2分别是该位置的横坐标和纵坐标;采用python自带的插值算法griddata求出插值函数f,将该块对应的原始图像坐标(axisx,axisy)作为插值函数f的输入,输出的就是该块对应的原始图像所有位置的插值数据z3。
9.优选地,所述步骤(2)具体为:从插值数据z3中筛选出第一次插值后的nan位置,该位置的坐标为(axisx_nan,axisy_nan);建立新的插值函数z2=f1(axisx2,axisy2),采用python自带的插值算法rbf求出新的插值函数f1;将坐标(axisx_nan,axisy_nan)输入f1,从而求出第一次插值之后原始图像的nan位置的数据z_nan,然后根据坐标(axisx_nan,axisy_nan)将z_nan赋值给对应坐标的z3,得到shading_profile。
10.优选地,所述步骤(3)中的筛选出nan位置具体为:根据基础数据shading中的nan
位置,推测shading_profile的中的nan位置,也就是,坐标(shading_profile_axisx,shading_profile_axisy)为nan位置,其中,shading_profile_axisx=x*bin_size+start_x+interval,shading_profile_axisy=y*bin_size+start_y+interval,x、y分别是nan位置对应的原始图像的横坐标和纵坐标,start_x、start_y分别是原始图像横向下采样的起始横坐标、起始纵坐标,interval表示[-bin_size,bin_size]的数组,所述块为正方形,bin_size为所述块的边长。
[0011]
优选地,如果坐标(shading_profile_axisx,shading_profile_axisy)不在原始图像的长宽范围之内,则将该坐标剔除。
[0012]
优选地,筛选非nan位置的方式为,设置一个阈值,像素数值大于阈值的位置为非nan位置。
[0013]
本发明弥补了python中griddata不支持外插值算法的缺陷,实现的插值结果与matlab的griddedinterpolant的结果非常接近,可以作为使用python需要外插值的实现方案。本发明兼顾了速度和内存的考虑,如果全部使用rbf插值算法,虽然支持外插值,但是速度及其慢,需要的内存也非常大。
附图说明
[0014]
图1为采用本发明插值与matlab插值比较图。
具体实施方式
[0015]
本发明提供的基于python插值的图像修正方法,核心在于以下三步:
[0016]
1.采用griddata插值算法,处理图1中的空白区域,即,对非nan区域进行插值,此时能够将大部分的数据实现插值,只剩余边缘需要忽略的数据。采用griddata处理大部分数据优点是快速,占用内存少。
[0017]
2.采用rbf插值算法,处理图1中的黑色区域,即,对第一次插值后的nan区域进行插值,这样rbf处理的数据量少,虽然rfb耗时,占用内存大,但是由于处理的数据量偏少,还是可以快速实现。
[0018]
3.找出经过外插值后,应该为nan的位置,然后将结果中需要忽略的数据置为nan。根据第二次插值之后获得的数据(包括nan)构建修正矩阵,该修正矩阵中大部分的数据是实数,只有极少的数据是nan(在边缘),修正矩阵中的数据为nan表示无需对原始图像的相应位置进行阴影矫正。根据插值之后的修正矩阵,对原图进行阴影修正,使得原图的亮度趋于一致。
[0019]
本发明基于python的一些算法实现图像插值,可以达到matlab提供的算法的插值效果,具体如下:
[0020]
第一步:整幅图像image横坐标用axisx表示,纵坐标用axisy表示,每一个坐标(axisy,axisx)对应的像素的值用z表示。将整幅图像image按照块进行下采样取平均值,得到每一个块的缩略图image1。块通常选取为正方形(bin_size*bin_size),这样方便计算,也可以是长方形等其他形状。然后将image1除以image1中像素最大的数值,得到插值的基础数据shading,同时记录原始图像下采样过程中的每一个块的起始坐标(axisx1,axisy1)。取出shading中非nan位置(shading_non_nan_index)的坐标,然后根据这个坐标,
选出shading中非nan位置的数据z2,以及对应的坐标(axisx2,axisy2),然后建立插值函数z2=f(axisx2,axisy2),此时数据z2、axisx2、axisy2全部为已知数据,并且z2中不包含nan,因此可以采用python自带的插值算法griddata求出插值函数f。然后根据插值函数f,求出原始图像下插值之后的数据,即,将原始图像坐标(axisx,axisy)作为插值函数f的输入,输出的就是原始图像所有位置的插值数据z3。
[0021]
对于fov特别大的情况,呈现的效果是外围的像素比较小,中间的像素比较大,此时设置一个阈值,比如60,然后将所有小于60的像素设置为nan。对于fov比较小的情况,不设置阈值,则所有的数据都是有效的,此时不存在nan。确定哪些像素为nan后,利用python自带的算法np.isnan()确定这些像素对应的坐标,从而取出shading中非nan的坐标。
[0022]
第二步:根据z3,筛选出第一次插值后的nan位置(axisx_nan,axisy_nan),即第一步中筛选确定的nan位置,此时建立新的插值函数z2=f1(axisx2,axisy2),数据z2、axisx2、axisy2全部为已知数据,可以采用python自带的插值算法rbf求出新的插值函数f1。求出f1之后,输入新的坐标(axisx_nan,axisy_nan),就可以求出第一次插值之后原始图像nan位置的数据z_nan,然后根据坐标(axisx_nan,axisy_nan),将z_nan赋值给对应坐标的z3,得到shading_profile,此时shading_profile的所有位置都是实数。
[0023]
第三步:由于matlab网格插值算法规定,如果横坐标axisx1对应的坐标点中含有nan,则由此位置映射出的插值区域的所有数据为nan,而上一步中shading_profile的所有数据都是实数,显然与matlab的结果是不同的,因此需要找出横坐标为axisx1的所有的点中nan位置的坐标,然后计算出每一个坐标插值的映射区域,再将这些区域的数据设置为nan。
[0024]
首先,根据shading中nan_index的坐标(shading中的数值为nan的坐标),建立新的插值函数f2=f1(f(x,y,z)),y表示的是原始图像中纵坐标(即第一步中的axisy),x表示的是原始图像中横坐标(即第一步中的axisx),z表示的是原始图像以(x,y)为中心点、bin_size为边的矩形区域的平均值,推测出shading_profile中应为nan位置的坐标。可以根据shading中的nan位置,推测插值之后shading_profile应该为nan位置。shading中一个nan坐标辐射的范围是(-bin_size,bin_size)(假设bin_size=16),比如x坐标是0,16,32,48,64...,y坐标是4,20,36,52,68...,z的数值是50,nan,60,80,90...,如果插入的点x11的横坐标为16,则插值之后数据z11的横坐标[0,32]都受到当前x11的影响,在f2函数原始的数据(x,y)的横向和纵向的辐射范围都是(-bin_size,bin_size),影响的是一个矩形区域。
[0025]
当原始坐标为(x,y),z=nan时,当插入的数据位于以(x,y)为中心,横向和纵向的辐射范围都是(-bin_size,bin_size),则插值的数据为nan。例如以原点(0,0)为中心,bin_size=16,则辐射范围为(-16,16),形成以原点为中心,上下左右距原点的垂直距离都是16的矩形区域(四个顶点的坐标分别为(16,16)、(16,-16)、(-16,16)、(-16,-16)),这个范围内插值的数据都是nan。
[0026]
推测shading_profile中应为nan位置的坐标,具体来说,可以根据原始图像坐标(x,y),得出原始图像坐标当前点的影响范围公式为shading_profile_axisx=x*bin_size+start_x+interval,其中start_x表示原始图像image横向下采样的起始横坐标,interval表示[-bin_size,bin_size]的数组,同理shading_profile_axisy=y*bin_size+start_y+interval,其中start_y表示原始图像image纵向下采样的起始纵坐标,然后采用python自
带的算法np.meshgrid将shading_profile_axisx和shading_profile_axisy数据进行平铺到整个原始图像画面,过滤异常坐标,即,判断某一坐标是否在原始图像的长宽范围之内,如果坐标超出图像区域的坐标,则该坐标为异常坐标。最后根据找到的坐标的位置,将shading_profile的相应位置设置为nan。将shading_profile_axisx=x*bin_size+start_x+interval带入横坐标x为nan时的坐标。将shading_profile_axisy=y*bin_size+start_y+interval带入纵坐标y为nan时的坐标。shading_profile_axisx和shading_profile_axisy数据进行平铺到整个画面之后的坐标就是最后需要的坐标,即,坐标是(shading_profile_axisx,shading_profile_axisy)的位置为nan,将该位置的数据置为nan。
[0027]
根据第二次插值后获得的数据(含nan)构建修正矩阵,该修正矩阵中大部分的数据是实数,只有极少的数据是nan(在边缘),修正矩阵中的数据为nan表示无需对原图的该位置进行阴影矫正,根据插值之后的修正矩阵,对原图进行阴影修正,使得原图的亮度趋于一致,阴影修正的方法是常规方式。
[0028]
从图1可以看到,位于左右两侧边缘的白色的点表示matlab插值之后的nan位置,黑色的点表示采用本发明插值之后的nan位置,两者几乎一样。
[0029]
将matlab插值获取的结果和本发明插值获取的结果,进行数值上的对比,可以发现两个数组的差值,最大波动只有0.0025,由此可见,他们的差异仅仅来源于数值精度。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1