CN118261784A - 一种固定缩放的优化实现方法 - Google Patents
一种固定缩放的优化实现方法 Download PDFInfo
- Publication number
- CN118261784A CN118261784A CN202211677106.6A CN202211677106A CN118261784A CN 118261784 A CN118261784 A CN 118261784A CN 202211677106 A CN202211677106 A CN 202211677106A CN 118261784 A CN118261784 A CN 118261784A
- Authority
- CN
- China
- Prior art keywords
- data
- register
- landmark
- group
- val
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 57
- 238000005457 optimization Methods 0.000 title abstract description 8
- 238000004364 calculation method Methods 0.000 claims abstract description 62
- 238000010586 diagram Methods 0.000 claims description 16
- 230000008569 process Effects 0.000 claims description 14
- 238000013461 design Methods 0.000 claims description 11
- 125000004122 cyclic group Chemical group 0.000 claims description 6
- 230000008707 rearrangement Effects 0.000 claims description 3
- 238000012545 processing Methods 0.000 description 10
- 238000005070 sampling Methods 0.000 description 6
- 238000004422 calculation algorithm Methods 0.000 description 3
- 238000000605 extraction Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 239000002699 waste material Substances 0.000 description 2
- 238000013459 approach Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000007429 general method Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000012067 mathematical method Methods 0.000 description 1
- 238000003672 processing method Methods 0.000 description 1
Landscapes
- Image Processing (AREA)
Abstract
本发明提供一种固定缩放的优化实现方法,包括:S1计算一行的像素值:原图1440x1080,生成目标图2048x1536,从原图的一整行中每次取出45个像素,生成目标图的64个像素点;设原图宽高分别为src_w=1440,src_h=1080,图像像素值数据指针为src_data;生成的目标图宽高分别为dst_w=2048,dst_h=1536,图像像素值数据指针为dst_data;原图的宽与生成图的宽比例为src_val;a)计算生成目标图像的64个像素值;b)计算生成目标图像一行的像素值;c)使用simd指令方法得到结果;S2高度上的计算:原图的高与生成图高比例为src_val;在高度上:landmark_h(j)=round(scale_val_h×j),(0≤j<dst_h,j∈N)。
Description
技术领域
本发明属于图像处理技术领域,特别涉及一种固定缩放的优化实现方法。
背景技术
双线性插值是一种已有数学方法,先理解单线性插值,再理解双线性插值。特别是,理解双线性插值是理解本申请的关键。
如图1所示,设函数f在点P=(x,y)的值,设函数f在Q11=(x1,y1)、Q12=(x1,y2),Q21=(x2,y1)以及Q22=(x2,y2)四个点的值。其中x、y是坐标值,f(Q)是(x,y)点对应的值,如果深度非1,那么深度方向的不同位置,(x,y)点一样,但f(Q)值会不一样,这里是按照深度为1示意情况。
双线性插值公式为:
在图像向上采用(放大图像)中,通常采用双线性插值计算。这种方法计算得到的精度相对较高,计算也是更加复杂,耗时也长。例如,在北京君正集成电路股份有限公司(简称:北京君正)的t31、t30、t20型号芯片中,需要将数据进行转化为高比特的数据,再进行计算。
因而,现有技术中的缺陷在于:
图像缩放的向上采样(放大图像)中,采用双线性插值向上采样,通用的算法设计方法,计算量很大,导致时间增加。
此外,现有技术中的常用术语如下:
图像缩放:在计算机图像处理和计算机图形学中,图像缩放(image scaling)是指对数字图像的大小进行调整的过程。
向上采样:放大图像(或称为上采样(upsampling)或成为向上采样)。双线性插值:双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。
发明内容
为了解决上述问题,本申请的目的在于:针对现有技术中时间增加的问题而降低时间。
具体地,本发明提供一种固定缩放的优化实现方法,所述方法包括以下步骤:
S1,计算一行的像素值:
原图1440x1080,生成目标图2048x1536,其中1440与2048的最大公约数是32,也就是一行循环最小次数为32次,所以可以从原图1440x1080的一行中每次取出45个像素,生成目标图2048x1 536的64个像素点;设原图1440x1080宽高分别为src_w=1440,src_h=1080,图像像素值数据指针为src_data;生成的目标图2048x1536宽高分别为dst_w=2048,dst_h=1536,图像像素值数据指针为dst_data;原图1440x1080的宽与生成图2048x1536宽比例为src_val:
得,scale_val=0.703125;
a)计算生成目标图像的64个像素值:
每行中对取出的45个像素,生成目标图2048x1536中的64个像素点,设开始取出原图和生成目标图的指针分别为src_val,dst_val;
设landmark(i)=round(scale_val×i),其中,round(scale_vdl×i)是对(scale_val×i)或(scale_val×(i-1))采用四舍五入方式取整;
将landmark(i)对应的像素值与landmark(i-1)对应的像素值相加,再求均值,得到的就是目标图像i位置对应的像值;这个计算过程,命名为循环均值;
b)计算生成目标图像一行的像素值:
设生成目标图像一行的行高为dst_j,对应使用的原图图像该行的行高为src_j,有
src_val=src_data+src_j*src_w;
dst_val=dst_data+dst_j*dst_w;
每次执行一次计算生成目标图像的64个像素值后,将
src_val+=45;
dst_val+=64;
直到该行执行完位置;
c)使用simd指令的设计方法:
simd指令中加载数据指令load每次加载16个8bit数据到寄存器中,一个寄存器只能存放128bit数据,也就是16个8比特数据。设寄存器为vrl,vrl=load(src_val),加载数据从src_val的地址开始加载,加载16个8bit数据。加载的有需要的像素值,也有选择编号,也就是选择哪些位置的坐标,即16个landmark(i)值。
再使用shufv指令对数据重排,设输入寄存器为vr2,vr3,选择编号的寄存器为vr_s,存放的是选择哪些位置的坐标,即16个landmark(i)值,输出寄存器为vr5。vr4=shufv(vr2,vr3,vr_s)。重排方式是根据vr_s中16个8bit数据的情况进行选择,数据大小为0~31;由于我们只需要第一个寄存器vr2中的数据,并根据缩放情况有的使用一次,有的使用两次,进行设置选择哪个数据;在shufv指令中,第一个寄存器vr2中所有数据编号在前面,第二个寄存器vr3数据在后面,也就是第一个寄存器编号为0~15,第二个寄存器数据编号为16~31。第三个寄存器vr_s是选择编号的寄存器。
计算landmark(i-1),由于shufv中,存放像素值的两个寄存器中,第一个寄存器中所有数据编号在前面,第二个寄存器数据在后面,也就是第一个寄存器编号为0~15,第二个寄存器数据编号为16~31;
第一组中,第一个寄存器放第一次加载的数据,只使用的第一个寄存器的数据,没有使用第二个寄存器中的数据,所以第二个寄存器随便放置任意寄存器数据;
第二组中,第一个寄存器放第二次加载的数据,第二个寄存器,放置第一次加载数据的寄存器;将landmark(i)中第一组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第10个位置,所以是16+10(其中16是第一个寄存器占用16个编号,第二个寄存器初始0的位置变为16),即26,第二组数据依次后移,最后一个数据溢出;
第三组中,第一个寄存器放第三次加载的数据,第二个寄存器,放置第二次加载数据的寄存器;将landmark(i)中第二组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第11个位置,所以是16+11(其中16是第一个寄存器占用16个编号,第二个寄存器初始0的位置变为16),即27,第三组数据依次后移,最后一个数据溢出;
第四组中,第一个寄存器放第四次加载的数据,第二个寄存器,放置第三次加载数据的寄存器;将landmark(i)中第三组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第10个位置,所以是16+10(其中16是第一个寄存器占用16个编号,第二个寄存器初始0的位置变为16),即26,第四组数据依次后移,最后一个数据溢出;
最后执行simd的均值指令计算,设输入输入寄存器vr6和vr7,vr6和vr7寄存器中每个里面存储的是16个8比特数据,生成结果保存到寄存器vr8,vr8里面存储的是16个8比特数据,具体指令为vr8=avg(vr6,vr7),这是求两组16个8比特数据对应的均值,通过simd的均值指令计算即可得到结果。
S2,在高度上的计算:
原图1440x1080的高与生成图2048x1536高比例为src_val:
得,scale_val_h=0.703125
在高度上使用公式
landmark_h(j)=round(scale_val_h×j),(0≤j<dst_h,j∈N)
其中j的取值范围是生成目标图像的高度范围,landmark_h(j)是取的具体原图图像的高度。
所述步骤S1中的a)进一步包括:
a)计算生成目标图像的64个像素值:
每行中对取出的45个像素,生成目标图2048x1536中的64个像素点,设开始取出原图和生成目标图的指针分别为src_val,dst_val;采用四舍五入方式计算;每个像素点计算公式:
round(scale_val×i)是对(scale_val×i)或(scale_val×(i-1))采用四舍五入方式取整;
设landmark(i)=round(scale_val×i);
计算landmark(i),每16个一组,有:
0,1,1,2,3,4,4,5,6,6,7,8,8,9,10,11;
11,12,13,13,14,15,15,16,17,18,18,19,20,20,21,22;23,23,24,25,25,26,27,27,28,29,30,30,31,32,32,33;34,34,35,36,37,37,38,39,39,40,41,41,42,43,44,44;
计算landmark(i-1),这是上面数据相左移动一个位置,第一个位置用0补充,每16个一组,有:
0,0,1,1,2,3,4,4,5,6,6,7,8,8,9,10;
11,11,12,13,13,14,15,15,16,17,18,18,19,20,20,21;22,23,23,24,25,25,26,27,27,28,29,30,30,31,32,32;33,34,34,35,36,37,37,38,39,39,40,41,41,42,43,44;
将landmark(i)对应的像素值与landmark(i-1)对应的像素值相加,再求均值,得到的就是目标图像i位置对应的像值;这个计算过程,命名为循环均值;由于在北京君正的t20,t30,t31型号芯片中有相对应的8bit均值计算的simd指令,能够实现上面的方法。
所述步骤S1中的c)进一步包括:
c)使用simd指令的设计方法:
simd指令中加载数据指令load每次加载16个8bit数据到寄存器中,一个寄存器只能存放128bit数据,也就是16个8比特数据。设寄存器为vr1,vr1=load(srcval),加载数据从src_val的地址开始加载,加载16个8bit数据。加载的有需要的像素值,也有选择编号,也就是选择哪些位置的坐标,即16个landmark(i)值。
第一组加载数据从0开始,第二次从11开始,第三组从23开始,第四组从34开始;加载完后,src_val+=45;
再使用指令shufv对数据重排,提取出如下的数据:
在shufv指令中,vr4=shufv(vr2,vr3,vr_s),输入数据的寄存器是两个寄存器vr2和vr3,vr_s寄存器为提取具体位置的坐标数据,第一个寄存器vr2中所有数据编号在前面,第二个寄存器vr3数据在后面,也就是第一个寄存器vr2编号为0~15,第二个寄存器vr3数据编号为16~31;这里只需要将需要提取的数据放到寄存器vr2中,vr3寄存器的数据可以是任意数据(由于不使用里面的数据,所以可以任意数据);
第一组是:
0,1,1,2,3,4,4,5,6,6,7,8,8,9,10,11;
由于提取数据对应的位置是当前寄存器脸数据的位置,即对应数据减第0个位置的数据,所以
第二组是:
0,1,2,2,3,4,4,5,6,7,7,8,9,9,10,11;
第三组是:
0,0,1,2,2,3,4,4,5,6,7,7,8,9,9,10;
第四组是:
0,0,1,2,3,3,4,5,5,6,7,7,8,9,10,10;
以上是计算landmark(i)的计算过程。
计算landmark(i-1),由于shufv中,vr4=shufv(vr2,vr3,vr_s),输入数据的寄存器是两个寄存器vr2和vr3,landmark(i-1)数据为vr_s准备的坐标数据,第一个寄存器中所有数据编号在前面,第二个寄存器数据在后面,也就是第一个寄存器编号为0~15,第二个寄存器数据编号为16~31;
第一组中,第一个寄存器放第一次加载的数据,第二个寄存器,随便放置任意寄存器数据;有
0,0,1,1,2,3,4,4,5,6,6,7,8,8,9,10;
第二组中,第一个寄存器放第二次加载的数据,第二个寄存器,放置第一次加载数据的寄存器;将landmark(i)中第一组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第10个位置,所以是16+10,即26,第二组数据依次后移,最后一个数据溢出,有
26,0,1,2,2,3,4,4,5,6,7,7,8,9,9,10;
第三组中,第一个寄存器放第三次加载的数据,第二个寄存器,放置第二次加载数据的寄存器;将landmark(i)中第二组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第11个位置,所以是16+11,即27,第三组数据依次后移,最后一个数据溢出,有
27,0,0,1,2,2,3,4,4,5,6,7,7,8,9,9
第四组中,第一个寄存器放第四次加载的数据,第二个寄存器,放置第三次加载数据的寄存器;将landmark(i)中第三组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第10个位置,所以是16+10,即26,第四组数据依次后移,最后一个数据溢出,有
26,0,0,1,2,3,3,4,5,5,6,7,7,8,9,10;
以上是计算landmark(i-1)的计算过程。
最后执行simd的均值指令计算,设输入输入寄存器vr6和vr7,vr6和vr7寄存器中每个里面存储的是16个8比特数据,生成结果保存到寄存器vr8,vr8里面存储的是16个8比特数据,具体指令为vr8=avg(vr6,vr7),这是求两组16个8比特数据对应的均值,通过simd的均值指令计算即可得到结果;
所述步骤S2进一步包括:
简化高度上计算,采用一次计算生成目标图像的三行数据,分别为:
landmark_h(j)landmark_h(j+1)landmark_h(j+2).
对于上面的三行原始图像数据,存在三种情况,一种是三行全不一样,一种是前两行一样,一种是后面行一样;
当原始图像数据三行全部一样时,这三行,使用行计算,得生成目标图像数据三行计算结果,再对生成目标图像数据后两行的结果,使用两行均值,计算得到一行结果,将生成结果赋给目标图像数据的第三行;
当原始图像数据两行一样时,对原始图像数据每行使用行计算,得到两行的目标图像数据结果,分别赋给目标图像数据的第一行和第三行,对这两行结果,使用两行均值,生成一行结果,赋给目标图像数据的第二行。
本方法针对特定大小特定格式的向上采样,图像格式是nv12,由1440x1080放大到2048x1536。
由此,本申请的优势在于:通过本方法可以节约时间,耗时降低到原来1/3甚至更少。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不构成对本发明的限定。
图1是双线性插值的示意图。
图2是本发明方法流程的示意图。
具体实施方式
为了能够更清楚地理解本发明的技术内容及优点,现结合附图对本发明进行进一步的详细说明。
本发明方法针对的是特定大小特定格式的向上采样,图像格式是nv12,由1440x1080放大到2048x1536。使用通用的方法进行处理所消耗的时间是本发明特定方法处理消耗时间的三倍以上。特别是,在北京君正T20之类的cpu主频低功耗低运行速度慢的芯片中无法实现实时处理(一般是每秒25帧)。同时占有CPU也会很高,导致芯片对于当前的缩放情况几乎不具有使用的价值。结合实际应用场景,用于大屏幕的显示,所以可以从算法本质和芯片对应的指令上进行重新设计,采用更高更有的方法实现,从而降低运算量和降低使用的指令个数。
本方法最核心的是数据排列、取数的方法,避免了冗余的运算,通过取数的方式,实现缩放。对于具体simd指令,属于simd的基础知识在此不再赘述。涉及在使用中,会有相应地解释。
本方法的算法设计:
向上采样,也就是放大图像,采用插值计算,与同尺寸2048x1536真实图像相比本身也带有误差,从这个角度思考,插值的主要目标是尽可能保留图像的平滑程度。所以从另一个角度思路,采样点位于原图1440x1080两个或四个像素点之间,采用均值求得等效为插值计算值。而采用均值计算,有相应的指令,可以实现8比特的运算。这种采用均值计算的方法,在具体设计中,设计成循环均值的方法。在UV数据的放大处理中,提取坐标位置与Y提取坐标位置的过程一样,UV处理中以两个数据为一个单元。UV使用的寄存器个数会是Y处理数据使用寄存器的个数的两倍。过程和原理完全一样。下面是实现Y数据的设计,具体实现如下:
S1,计算一行的像素值:
原图1440x1080,生成目标图2048x1536,其中1440与2048的最大公约数是32,也就是一行循环最小次数为32次,可以从原图1440x1080的一行中每次取出45个像素,生成目标图2048x1 536的64个像素点。设原图1440x1080宽高分别为src_w=1440,src_h=1080,图像像素值数据指针为src_data;生成的目标图2048x1536宽高分别为dst_w=2048,dst_h=1536,图像像素值数据指针为dst_data。原图1440x1080的宽与生成图2048x1536宽比例为src_val:
得,scale_val=0.703125
a)计算生成目标图像的64个像素值。
每行中对取出的45个像素,生成目标图2048x1536中的64个像素点,设开始取出原图和生成目标图的指针分别为src_val,dst_val;采用四舍五入方式计算。每个像素点计算公式:
roun(scale_val×i)是对(scale_val×i)或(scale_val×(i-1))采用四舍五入方式取整。设landmark(i)=round(scale_val×i)。
计算landmark(i),每16个一组,有:
0,1,1,2,3,4,4,5,6,6,7,8,8,9,10,11;
11,12,13,13,14,15,15,16,17,18,18,19,20,20,21,22;
23,23,24,25,25,26,27,27,28,29,30,30,31,32,32,33
34,34,35,36,37,37,38,39,39,40,41,41,42,43,44,44
计算landmark(i-1),这是上面数据相左移动一个位置,第一个位置用0补充,每16个一组,有:
0,0,1,1,2,3,4,4,5,6,6,7,8,8,9,10;
11,11,12,13,13,14,15,15,16,17,18,18,19,20,20,21;
22,23,23,24,25,25,26,27,27,28,29,30,30,31,32,32;
33,34,34,35,36,37,37,38,39,39,40,41,41,42,43,44;
将landmark(i)对应的像素值与landmark(i-1)对应的像素值相加,再求均值,得到的就是目标图像i位置对应的像值。这个计算过程,我们命名为循环均值。由于在北京君正t20,t30,t31型号芯片中有相对应的8bit均值计算的simd指令,可以实现上面的方法。
b)计算生成目标图像一行的像素值。
设生成目标图像一行的行高为dst_j,对应使用的原图图像该行的行高为src_j,有
src_val=src_data+src_j*src_w;
dst_val=dst_data+dst_j*dst_w;
每次执行一次计算生成目标图像的64个像素值后,将
src_val+=45;
dst_val+=64;
直到该行执行完位置。
c)使用simd指令的设计方法
simd指令中加载数据指令load每次加载16个8bit数据到寄存器中,一个寄存器只能存放128bit数据,也就是16个8比特数据。设寄存器为vrl,vrl=load(src_val),加载数据从src_val的地址开始加载,加载16个8bit数据。加载的有需要的像素值,也有选择编号,也就是选择哪些位置的坐标,即16个landmark(i)值。
第一组加载数据从0开始,第二次从11开始,第三组从23开始,第四组从34开始。加载完后,src_val+=45;
再使用指令shufv对数据重排,提取出如下的数据。在shufv指令中,vr4=shufv(vr2,vr3,vr_s),前两个寄存器vr2、vr3,第一个寄存器vr2中所有数据编号在前面,第二个寄存器vr3数据在后面,也就是第一个寄存器编号为0~15,第二个寄存器数据编号为16~31。这里只需要将需要提取的数据放到寄存器第一个位置,第二个位置任意一个寄存器都可以(不会提取到第二个寄存器的数据)。第一组是:
0,1,1,2,3,4,4,5,6,6,7,8,8,9,10,11;
由于提取数据对应的位置是当前寄存器脸数据的位置,即对应数据减第0个位置的数据,所以第二组是:
0,1,2,2,3,4,4,5,6,7,7,8,9,9,10,11;
第三组:
0,0,1,2,2,3,4,4,5,6,7,7,8,9,9,10;
第四组:
0,0,1,2,3,3,4,5,5,6,7,7,8,9,10,10
计算landmark(i-1),由于shufv中,放置两个寄存器,第一个寄存器中所有数据编号在前面,第二个寄存器数据在后面,也就是第一个寄存器编号为0~15,第二个寄存器数据编号为16~31。第一组中,第一个寄存器放第一次加载的数据,第二个寄存器,随便放置任意寄存器数据。
有
0,0,1,1,2,3,4,4,5,6,6,7,8,8,9,10;
第二组中,第一个寄存器放第二次加载的数据,第二个寄存器,放置第一次加载数据的寄存器。将landmark(i)中第一组的最后一个数据放置到landmark(i)中第二组的第0的位置。由于是读取的是第二个寄存器中第10个位置,所以是16+10,即26,第二组数据依次后移,最后一个数据溢出,有
26,0,1,2,2,3,4,4,5,6,7,7,8,9,9,10;
第三组中,第一个寄存器放第三次加载的数据,第二个寄存器,放置第二次加载数据的寄存器。将landmark(i)中第二组的最后一个数据放置到landmark(i)中第二组的第0的位置。由于是读取的是第二个寄存器中第11个位置,所以是16+11,即27,第三组数据依次后移,最后一个数据溢出,有
26,0,1,2,2,3,4,4,5,6,7,7,8,9,9,10;
第四组中,第一个寄存器放第四次加载的数据,第二个寄存器,放置第三次加载数据的寄存器。将landmark(i)中第三组的最后一个数据放置到landmark(i)中第二组的第0的位置。由于是读取的是第二个寄存器中第10个位置,所以是16+10,即26,第四组数据依次后移,最后一个数据溢出,有
27,0,0,1,2,2,3,4,4,5,6,7,7,8,9,9,10;
第四组:
26,0,0,1,2,3,3,4,5,5,6,7,7,8,9,10,10
最后执行simd的均值指令计算,即可得到结果。
S2,在高度上的计算:
原图1440x1080的高与生成图2048x1536高比例为src_val:
得,scale_val_h=0.703125
在高度上使用公式
landmark_h(j)=round(scale_val_h×j),(0≤j<dst_h,j∈N)
其中j的取值范围是生成目标图像的高度范围,landmark-h(j)是取的具体原图图像的高度。简化高度上计算,采用一次计算生成目标图像的三行数据。分别为:
landmark_h(j),landmark_h(j+1),landmark_h(j+2)
对于上面的三行原始图像数据,存在三种情况,一种是三行全不一样,一种是前两行一样,一种是后面行一样。当原始图像数据三行全部一样时,这三行,使用行计算,得生成目标图像数据三行计算结果,再对生成目标图像数据后两行的结果,使用两行均值,计算得到一行结果,将生成结果赋给目标图像数据的第三行。当原始图像数据两行一样时,对原始图像数据每行使用行计算,得到两行的目标图像数据结果,分别赋给目标图像数据的第一行和第三行,对这两行结果,使用两行均值,生成一行结果,赋给目标图像数据的第二行。
综上所示,如图2所示,一种固定缩放的优化实现方法,所述方法包括以下步骤:
S1,计算一行的像素值:
由于1440与2048的最大公约数是32;所以可以从原图1440x1080的一行中每次取出45个像素,生成目标图2048x1536的64个像素点;
设原图1440x1080宽高分别为src_w=1440,src_h=1080,图像像素值数据指针为src_data;生成的目标图2048x1536宽高分别为dst_w=2048,dst_h=1536,图像像素值数据指针为dst_data;原图1440x1080的宽与生成图2048x1536宽比例为src_val:
得,scale_val=0.703125;
a)计算生成目标图像的64个像素值:
每行中对取出的45个像素,生成目标图2048x1536中的64个像素点,设开始取出原图和生成目标图的指针分别为src_val,dst_val;
设landmark(i)=round(scale_val×i),其中,round(scale_val×i)是对(scale-val×i)或(scale-val(i-1))采用四舍五入方式取整;
将landmark(i)对应的像素值与landmark(i-1)对应的像素值相加,再求均值,得到的就是目标图像i位置对应的像值;这个计算过程,命名为循环均值;
b)计算生成目标图像一行的像素值:
设生成目标图像一行的行高为dst_j,对应使用的原图图像该行的行高为src_j,有
src_val=src_data+src_j*src_w;
dst_val=dst_data+dst_j*dst_w;
每次执行一次计算生成目标图像的64个像素值后,将
src_val+=45;
dst_val+=64;
直到该行执行完位置;
c)使用simd指令的设计方法:
simd指令中加载数据指令load每次加载16个8bit数据到寄存器中,一个寄存器只能存放128bit数据,也就是16个8比特数据。设寄存器为vrl,vrl=load(src_val),加载数据从src_val的地址开始加载,加载16个8bit数据。加载的有需要的像素值,也有选择编号,也就是选择哪些位置的坐标,即16个landmark(i)值。
再使用shufv指令对数据重排,设输入寄存器为vr2,vr3,选择编号的寄存器为vr_s,存放的是选择哪些位置的坐标,即16个landmark(i)值,输出寄存器为vr5。vr4=shufv(vr2,vr3,vr_s)。重排方式是根据vr_s中16个8bit数据的情况进行选择,数据大小为0~31。由于我们只需要第一个寄存器vr2中的数据,并根据缩放情况有的使用一次,有的使用两次,进行设置选择哪个数据。在shufv指令中,第一个寄存器vr2中所有数据编号在前面,第二个寄存器vr3数据在后面,也就是第一个寄存器编号为0~15,第二个寄存器数据编号为16~31。第三个寄存器vr_s是选择编号的寄存器。
计算landmark(i-1),由于shufv中,两个寄存器vr2,vr3,第一个寄存器vr2中所有数据编号在前面,第二个寄存器vr3数据在后面,也就是第一个寄存器编号为0~15,第二个寄存器数据编号为16~31;
第一组中,第一个寄存器放第一次加载的数据,第二个寄存器,随便放置任意寄存器数据;
第二组中,第一个寄存器放第二次加载的数据,第二个寄存器,放置第一次加载数据的寄存器;将landmark(i)中第一组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第10个位置,所以是16+10,即26,第二组数据依次后移,最后一个数据溢出;
第三组中,第一个寄存器放第三次加载的数据,第二个寄存器,放置第二次加载数据的寄存器。将landmark(i)中第二组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第11个位置,所以是16+11,即27,第三组数据依次后移,最后一个数据溢出;
第四组中,第一个寄存器放第四次加载的数据,第二个寄存器,放置第三次加载数据的寄存器;将landmark(i)中第三组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第10个位置,所以是16+10,即26,第四组数据依次后移,最后一个数据溢出;
最后执行simd的均值指令计算,即可得到结果;
S2,在高度上的计算:
原图1440x1080的高与生成图2048x1536高比例为src_val:
得,scade_val_h=0.703125
在高度上使用公式
landmark_h(j)=round(scale_val_h×j),(0≤j<dst_h,j∈N)
其中j的取值范围是生成目标图像的高度范围,landmark_h(j)是取的具体原图图像的高度。
对于固定放大原图1440x1080,生成目标图2048x1536,只需针对性的计算出一次组坐标位置参数45对应64,加载参数是45个,存在一定浪费,但生成的结果是64个,避免浪费。否则后面可以重复使用对应关系,从而节省很多计算时间。同时这种处理方法,将原图中每两行每两行进行处理,由于加载数据先存到cache中,按完整的行处理,比按列或是分块处理更快。节省加载时间,因而这是一种特定的设计方法。
本方法固定缩放的一种优化方法,采用的是一行独立完成,再处理下一行。生成两组64个landmark值,后面重复使用。如果使用通用则存在重复计算,加载数据也不连续,导致跳跃地址,降低速度。所以采用当前固定缩放的优化方法更好。由于每次加载数据10或11个,可以每次加载一个上次数据,寄存器能够放下,所以可以实现,是循环近似均值。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (5)
1.一种固定缩放的优化实现方法,其特征在于,所述方法包括以下步骤:
S1,计算一行的像素值:
原图1440x1080,生成目标图2048x1536,其中1440与2048的最大公约数是32,也就是一行循环最小次数为32次,所以能够从原图1440x1080的一行中每次取出45个像素,生成目标图2048x1536的64个像素点,这也是原图和生成图对应的整数像素个数的最小值;
设原图1440x1080宽高分别为srcw=1440,srch=1080,图像像素值数据指针为srcdata;生成的目标图2048x1536宽高分别为dstw=2048,dsth=1536,图像像素值数据指针为dstdata;原图1440x1080的宽与生成图2048x1536宽比例为srcval:
得,scale_val=0.703125;
a)计算生成目标图像的64个像素值:
每行中对取出的45个像素,生成目标图2048x1536中的64个像素点,设开始取出原图和生成目标图的指针分别为srcval,dstval;
设landnark(i)=round(scale_val×i),其中,rouud(scale_val×i)是对(scale_val×i)或(scale_val×(i-1))采用四舍五入方式取整;
将landnark(i)对应的像素值与landnark(i-1)对应的像素值相加,再求均值,得到的就是目标图像i位置对应的像值;这个计算过程,命名为循环均值;
b)计算生成目标图像一行的像素值:
设生成目标图像一行的行高为dst_j,对应使用的原图图像该行的行高为src_j,有
src_val=src_data+src_j*src_w;
dst_val=dst_data+dst_j*dst_w;
每次执行一次计算生成目标图像的64个像素值后,将
src_val+=45;
dst_val+=64;
直到该行执行完位置;
c)使用simd指令的设计方法:
simd指令中加载数据指令load每次加载16个8bit数据到寄存器中,一个寄存器只能存放128bit数据,也就是16个8比特数据;设寄存器为vr1,vr1=load(src_val),加载数据从src_val的地址开始加载,加载16个8bit数据;加载的有需要的像素值,也有选择编号,也就是选择哪些位置的坐标,即16个landmark(i)值;
再使用shufv指令对数据重排,设输入寄存器为vr2,vr3,选择编号的寄存器为vr_s,存放的是选择哪些位置的坐标,即16个landmark(i)值,输出寄存器为vr5;vr4=shufv(vr2,vr3,vr_s);重排方式是根据vr_s中16个8bit数据的情况进行选择,数据大小为0~31;由于只需要第一个寄存器vr2中的数据,并根据缩放情况有的使用一次,有的使用两次,进行设置选择哪个数据;在shufv指令中,第一个寄存器vr2中所有数据编号在前面,第二个寄存器vr3数据在后面,也就是第一个寄存器编号为0~15,第二个寄存器数据编号为16~31;第三个寄存器vr_s是选择编号的寄存器;
提取出如下的数据:
第一组中,第一个寄存器放第一次加载的数据,只使用第一个寄存器的数据,没有使用第二个寄存器中的数据,所以第二个寄存器随便放置任意寄存器数据;
第二组中,第一个寄存器放第二次加载的数据,第二个寄存器,放置第一次加载数据的寄存器;将landmark(i)中第一组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第10个位置,所以是16+10,即26,其中16是第一个寄存器占用16个编号,第二个寄存器初始0的位置变为16,第二组数据依次后移,最后一个数据溢出;
第三组中,第一个寄存器放第三次加载的数据,第二个寄存器,放置第二次加载数据的寄存器;将landmark(i)中第二组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第11个位置,所以是16+11,即27,其中16是第一个寄存器占用16个编号,第二个寄存器初始0的位置变为16,第三组数据依次后移,最后一个数据溢出;
第四组中,第一个寄存器放第四次加载的数据,第二个寄存器,放置第三次加载数据的寄存器;将landmark(i)中第三组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第10个位置,所以是16+10,即26,其中16是第一个寄存器占用16个编号,第二个寄存器初始0的位置变为16,第四组数据依次后移,最后一个数据溢出;
最后执行simd的均值指令计算,设输入寄存器vr6和vr7,vr6和vr7寄存器中每个里面存储的是16个8比特数据,生成结果保存到寄存器vr8,vr8里面存储的是16个8比特数据,具体指令为vr8=avg(vr6,vr7),这是求两组16个8比特数据对应的均值,通过simd的均值指令计算即可得到结果;
S2,在高度上的计算:
原图1440x1080的高与生成图2048x1536高比例为src_val:
得,scale_va,_h=0.703125
在高度上使用公式
landmark_h(j)=round(scale_va,_h×j),(0≤j<dst_h,j∈N)
其中j的取值范围是生成目标图像的高度范围,landmark_h(j)是取的具体原图图像的高度。
2.根据权利要求1所述的一种固定缩放的优化实现方法,其特征在于,所述步骤S1中的a)进一步包括:
a)计算生成目标图像的64个像素值:
每行中对取出的45个像素,生成目标图2048x1536中的64个像素点,设开始取出原图和生成目标图的指针分别为src_val,dst_val;采用四舍五入方式计算;每个像素点计算公式:
round(scale_val×i)是对(scale_val×i)或(scale_val×(i-1))采用四舍五入方式取整;
设landmark(i)=round(scale_val×i);
计算landmark(i),每16个一组,有:
0,1,1,2,3,4,4,5,6,6,7,8,8,9,10,11;
11,12,13,13,14,15,15,16,17,18,18,19,20,20,21,22;
23,23,24,25,25,26,27,27,28,29,30,30,31,32,32,33;
34,34,35,36,37,37,38,39,39,40,41,41,42,43,44,44;
计算landmark(i-1),这是上面数据相左移动一个位置,第一个位置用0补充,每16个一组,有:
0,0,1,1,2,3,4,4,5,6,6,7,8,8,9,10;
11,11,12,13,13,14,15,15,16,17,18,18,19,20,20,21;
22,23,23,24,25,25,26,27,27,28,29,30,30,31,32,32;
33,34,34,35,36,37,37,38,39,39,40,41,41,42,43,44;
将landmark(i)对应的像素值与landmark(i-1)对应的像素值相加,再求均值,得到的就是目标图像i位置对应的像值;这个计算过程,命名为循环均值计算。
3.根据权利要求1所述的一种固定缩放的优化实现方法,其特征在于,所述步骤S1中的c)进一步包括:
c)使用simd指令的设计方法:
simd指令中的寄存器每次加载16个8bit数据,计算landmark(i),每16个一组,计算landmark(i);
第一组加载数据从0开始,第二次从11开始,第三组从23开始,第四组从34开始;加载完后,src_va1+=45;
再使用指令shufv对数据重排,提取出如下的数据:
在shufv指令中,vr4=shufv(vr2,vr3,vr_s),输入数据的寄存器是两个寄存器vr2和vr3,vr_s寄存器为提取具体位置的坐标数据,第一个寄存器vr2中所有数据编号在前面,第二个寄存器vr3数据在后面,也就是第一个寄存器vr2编号为0~15,第二个寄存器vr3数据编号为16~31;这里只需要将需要提取的数据放到寄存器vr2中,vr3寄存器的数据能够是任意数据,由于不使用里面的数据,所以能够任意数据;
计算landmark(i)
第一组是:
0,1,1,2,3,4,4,5,6,6,7,8,8,9,10,11;
由于提取数据对应的位置是当前寄存器脸数据的位置,即对应数据减第0个位置的数据,所以
第二组是:
0,1,2,2,3,4,4,5,6,7,7,8,9,9,10,11;
第三组是:
0,0,1,2,2,3,4,4,5,6,7,7,8,9,9,10;
第四组是:
0,0,1,2,3,3,4,5,5,6,7,7,8,9,10,10;
以上是计算landmark(i)的计算过程;
计算landmark(i-1),由于shufv中,vr4=shufv(vr2,vr3,vr_s),输入数据的寄存器是两个寄存器vr2和vr3,landmark(i-1)数据为vr_s准备的坐标数据
第一组中,第一个寄存器放第一次加载的数据,第二个寄存器,随便放置任意寄存器数据;有
0,0,1,1,2,3,4,4,5,6,6,7,8,8,9,10;
第二组中,第一个寄存器放第二次加载的数据,第二个寄存器,放置第一次加载数据的寄存器;将landmark(i)中第一组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第10个位置,所以是16+10,即26,第二组数据依次后移,最后一个数据溢出,有
26,0,1,2,2,3,4,4,5,6,7,7,8,9,9,10;
第三组中,第一个寄存器放第三次加载的数据,第二个寄存器,放置第二次加载数据的寄存器;将landmark(i)中第二组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第11个位置,所以是16+11,即27,第三组数据依次后移,最后一个数据溢出,有
27,0,0,1,2,2,3,4,4,5,6,7,7,8,9,9
第四组中,第一个寄存器放第四次加载的数据,第二个寄存器,放置第三次加载数据的寄存器;将landmark(i)中第三组的最后一个数据放置到landmark(i)中第二组的第0的位置;由于是读取的是第二个寄存器中第10个位置,所以是16+10,即26,第四组数据依次后移,最后一个数据溢出,有
26,0,0,1,2,3,3,4,5,5,6,7,7,8,9,10
以上是计算landmark(i-1)的计算过程;
最后执行simd的均值指令计算,设输入输入寄存器vr6和vr7,vr6和vr7寄存器中每个里面存储的是16个8比特数据,生成结果保存到寄存器vr8,vr8里面存储的是16个8比特数据,具体指令为vr8=avg(vr6,vr7),这是求两组16个8比特数据对应的均值,通过simd的均值指令计算即可得到结果。
4.根据权利要求1所述的一种固定缩放的优化实现方法,其特征在于,所述步骤S2进一步包括:
简化高度上计算,采用一次计算生成目标图像的三行数据,分别为:
landmark_h(j),landmark_h(j+1),lamdmark_h(j+2)
对于上面的三行原始图像数据,存在三种情况,一种是三行全不一样,一种是前两行一样,一种是后面行一样;
当原始图像数据三行全部一样时,这三行,使用行计算,得生成目标图像数据三行计算结果,再对生成目标图像数据后两行的结果,使用两行均值,计算得到一行结果,将生成结果赋给目标图像数据的第三行;
当原始图像数据两行一样时,对原始图像数据每行使用行计算,得到两行的目标图像数据结果,分别赋给目标图像数据的第一行和第三行,对这两行结果,使用两行均值,生成一行结果,赋给目标图像数据的第二行。
5.根据权利要求1所述的一种固定缩放的优化实现方法,其特征在于,所述方法针对特定大小特定格式的向上采样,图像格式是nv12,由1440x1080放大到2048x1536。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211677106.6A CN118261784A (zh) | 2022-12-26 | 2022-12-26 | 一种固定缩放的优化实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211677106.6A CN118261784A (zh) | 2022-12-26 | 2022-12-26 | 一种固定缩放的优化实现方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN118261784A true CN118261784A (zh) | 2024-06-28 |
Family
ID=91605521
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211677106.6A Pending CN118261784A (zh) | 2022-12-26 | 2022-12-26 | 一种固定缩放的优化实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN118261784A (zh) |
-
2022
- 2022-12-26 CN CN202211677106.6A patent/CN118261784A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2910979B2 (ja) | コンピュータグラフィックシステムのサブピクセルマスク発生方法および装置 | |
US5973705A (en) | Geometry pipeline implemented on a SIMD machine | |
JP5294313B2 (ja) | ベジェ曲線描画装置、ベジェ曲線描画方法およびプログラム | |
KR20130097689A (ko) | 병렬 스케일러 프로세싱 | |
JP2007065039A (ja) | 画像処理装置 | |
WO2013005366A1 (ja) | アンチエイリアス画像生成装置およびアンチエイリアス画像生成方法 | |
JP5785256B2 (ja) | テキストレンダリングのためのルックアップテーブル | |
RU2510939C2 (ru) | Система и способ декодирования, выполняемый для кодирования блоков элементов текстуры | |
CN118261784A (zh) | 一种固定缩放的优化实现方法 | |
JPH05233795A (ja) | 画像拡大縮小装置 | |
JPH03144782A (ja) | 三次元図形処理装置 | |
CN118261785A (zh) | 一种图像放大2倍的优化实现方法 | |
CN118261783A (zh) | 一种通用缩放的优化方法 | |
CN108805846A (zh) | 二值图像处理优化的方法及其系统 | |
CN105872306B (zh) | 用于图像缩放的设备和方法 | |
CN113887720B (zh) | 一种上采样逆向分块映射方法 | |
JP6262621B2 (ja) | 画像の拡大縮小処理装置および画像の拡大縮小処理方法 | |
US7092035B1 (en) | Block move engine with scaling and/or filtering for video or graphics | |
CN116127261B (zh) | 处理器中矩阵乘累加方法、装置及电子设备 | |
JP2005322959A (ja) | 画像処理装置、携帯端末、画像処理プログラム及び画像処理方法 | |
CN111127323A (zh) | 一种基于fpga的图像缩小方法 | |
JP2004288198A (ja) | 画像データの拡大/縮小装置及び方法 | |
CN118229511A (zh) | 一种适用DSP的小图像remap优化方法、系统、设备及介质 | |
CN115904489A (zh) | 一种特征图叠加优化的方法 | |
CN111105353A (zh) | 一种基于fpga的图像放大方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination |