一种灰度图图像均值预处理的优化方法与流程

文档序号:33246390发布日期:2023-02-17 23:23阅读:24来源:国知局
一种灰度图图像均值预处理的优化方法与流程

1.本发明涉及图像处理技术领域,特别涉及一种灰度图图像均值预处理的优化方法。


背景技术:

2.在现有的图像处理技术中,特别是针对灰度图或是一个通道的图像,例如在活体检测采集的红外图像,是单通道图像,是一个灰度图。一些为了加速处理也会将彩色图处理成一个通道的灰度图,作为原始图像的输入。处理过程中经常会使用累加和求均值的方法,但是普通的加和、普通的均值计算,速度会很慢,例如北京君正集成电路股份有限公司(简称:北京君正)t30、t31型号的芯片,现有技术中计算均值的速度会拖延整体的运行速度。芯片上使用现有技术的普通方法,是连续相加,把整个图数据累加到一个数据,再求平均,时间比较长,且没有使用simd对均值的实现。此外,目前其他芯片上也没有发现针对一张图像使用simd求均值的实现方法。一些其他求均值的应用,使用的实现方法,加载16个8比特数据,将原始8比特数据转化为32比特,然后每4个一组,使用simd累加,再加载16个数据,再转化为16比特,再累加,直到最后,再将这组数据累加,再求平均。这种方法效率也是非常低。
3.现有技术中的常用术语如下:
4.1、均值:均值一般指平均数。平均数,统计学术语,是表示一组数据集中趋势的量数,是指在一组数据中所有数据之和再除以这组数据的个数。它是反映数据集中趋势的一项指标。解答平均数应用题的关键在于确定“总数量”以及和总数量对应的总份数。
5.2、灰度图:只有一个通道的图像。
6.3、simd指令(singleinstructionmultipledata),即一种以向量方式计算的指令。单指令流多数据流,也就是说一次运算指令可以执行多个数据流,这样在很多时候可以提高程序的运算速度。simd指令可以理解为运行一次指令,运行指定大小数组的运算。128bit的simd指令,数组大小是用128bit定义,放16个8bit数据,或放4个32比特数据,或放8个16bit数据。例如“两个数组”相加,一条simd指令直接就得到。


技术实现要素:

7.为了解决上述现有技术中的问题,本技术的目的在于:提高计算均值的速度。可以实现40倍的提升。
8.具体地,本发明提供一种灰度图图像均值预处理的优化方法,所述方法针对灰度图,每次加载128个图像数据,一个寄存器可以加载16个8bit数据,使用8个变量寄存器中,分别为vrd0,vrd2,vrd4,vrd6,vrd8,vrd10,vrd12,vrd14,再将加载的寄存器数据转化为16比特,即使用16个寄存器存储数据,对上面的变量寄存器进行复用,再增加8个变量寄存器,这里会生成vrd0,vrd1,vrd2,vrd3,vrd4,vrd5,vrd6,vrd7,vrd8,vrd9,vrd10,vrd11,vrd12,vrd13,vrd14,vrd15;使用一个寄存器sum_h0进行16bit数据的累加,当sum_h0累加到256次时,对数据进行右移位8位,等价计算为除以256,再使用一个新的寄存器sum_h1对
移位后的sum_h0进行累加,而sum_h0初始化为0,再重新累加加载的新的数据;使用sum_h1对移位后的sum_h0进行累加,sum_h1累加到256次时,将sum_h1的结果保存到一个数组中;最后将数组的数据,再进行累加,再求均值。
9.所述方法进一步包括:
10.s1,初始化和使用的变量寄存器声明:设vri0为将8bit寄存器中的前8个数据转化为16bit的选择寄存器,vri1为将8bit寄存器中的后8个数据转化为16bit的选择寄存器;
11.预处理的数据为indata,数据宽为width,长为height,数据总数为piel_count=width*height;
12.设一个数据组为vsave[8],一个常规临时变量sum_int,均值为avg,统计sum_h1累加次数的计算器count,初始为0;
[0013]
s2,加载128个图像数据到vrd0,vrd1,vrd2,vrd3,vrd4,vrd5,vrd6,vrd7,vrd8,vrd9,vrd10,vrd11,vrd12,vrd13,vrd14,vrd15,然后在对indata指针进行变化,即indata=indata+128;
[0014]
s3,使用设置好的选择顺序实现对数据由8bit转化为16bit,由于在指令集中没有实现将8bit直接转化为16bit的指令,所以需要使用任意取值指令实现该功能,也就是设置两个选择的寄存器vri0,vri1,并对里面的具体选择顺序预先设计好;
[0015]
s4,使用一个寄存器sum_h0进行16bit数据的累加,第一次累计和需要初始化时,sum_h0内数据为0;
[0016]
s5,重复步骤s2、s3、s4,直到循环次数达到256次时,对sum_h0进行移位处理,再将处理后结果累加到sum_h1中,最后将sum_h0内的数据置0,同时count加1;
[0017]
s6,重复步骤s2、s3、s4、s5,直到循环次数达到256次时,将sum_h1保存到vsave[8]中,对vsave[8]的数据进行求和为sum_int,sum_h1内的数据置为0;重复步骤s2、s3、s4、s5,直至所有数据计算完;
[0018]
s7,求均值:所述将sum_h1的数据保存到vsave[8]中,对vsave[8]的数据进行求和为sum_int,累加的次数为count,则均值为:avg=sum_int/count;sum_h1是个寄存器,里面放的是8个16比特数据,把里面的数据取出来放到数组vsave[8]中,将数组vsave[8]里面的8个数据累加为sum_int。
[0019]
所述方法应用于具有simd指令的芯片,对相应的指令集进行优化处理,处理的目标的长*宽为2048的倍数,图像均值预处理要求的精度误差在1以内,使用的相应的指令集有加法指令、移位指令、任意取值指令、除法指令、加载数据指令、保存数据指令。
[0020]
所述方法应用于北京君正t30、t31型号芯片。
[0021]
所述步骤s2中,对indata指针进行变化,进一步包括加载数据指令,输入的待载入的数据,当前是数据的指针indata,从该数据indata在内存里指向的位置0,16,
……
96,112开始加载128bit的数据,如果是8bit的数据是加载16个,如果是16bit数据加载8个,如果是32bit,加载4个数据:
[0022]
vrd0=ingenic_load(indata,0);
[0023]
vrd2=ingenic_load(indata,16);
[0024]
vrd4=ingenic_load(indata,32);
[0025]
vrd6=ingenic_load(indata,48);
[0026]
vrd8=ingenic_load(indata,64);
[0027]
vrd10=ingenic_load(indata,80);
[0028]
vrd12=ingenic_load(indata,96);
[0029]
vrd14=ingenic_load(indata,112);
[0030]
indata=indata+128。
[0031]
所述步骤s3,进一步包括任意取值指令:从变量vrd0,vrd2,
……
,vrd12,vrd14和vrd0,vrd2,
……
,vrd12,vrd14中根据vri1,vri0设置的编号选择出4个或8个或16个数据,在使用该指令时,需要占有一个永久寄存器vri1或vir0,用于指令选择具体位置的数据:
[0032]
vrd1=ingenic_choise_h(vrd0,vrd0,vri1);
[0033]
vrd0=ingenic_choise_h(vrd0,vrd0,vri0);
[0034]
vrd3=ingenic_choise_h(vrd2,vrd2,vri1);
[0035]
vrd2=ingenic_choise_h(vrd2,vrd2,vri0);
[0036]
vrd5=ingenic_choise_h(vrd4,vrd4,vri1);
[0037]
vrd4=ingenic_choise_h(vrd4,vrd4,vri0);
[0038]
vrd7=ingenic_choise_h(vrd6,vrd6,vri1);
[0039]
vrd6=ingenic_choise_h(vrd6,vrd6,vri0);
[0040]
vrd9=ingenic_choise_h(vrd8,vrd8,vri1);
[0041]
vrd8=ingenic_choise_h(vrd8,vrd8,vri0);
[0042]
vrd11=ingenic_choise_h(vrd10,vrd10,vri1);
[0043]
vrd10=ingenic_choise_h(vrd10,vrd10,vri0);
[0044]
vrd13=ingenic_choise_h(vrd12,vrd12,vri1);
[0045]
vrd12=ingenic_choise_h(vrd12,vrd12,vri0);
[0046]
vrd15=ingenic_choise_h(vrd14,vrd14,vri1);
[0047]
vrd14=ingenic_choise_h(vrd14,vrd14,vri0)。
[0048]
所述步骤s4中,进一步包括加法指令,输入变量sum_h0,vrd0,vrd1,
……
vrd14,vrd15输出变量是sum_h0,sum_h0存储的是8个int16_t的数据,sum_h0和vrd0
……
vrd15,存储的是8个int16_t数据:
[0049]
sum_h0=ingenic_add_h(sum_h0,vrd0);
[0050]
sum_h0=ingenic_add_h(sum_h0,vrd1);
[0051]
sum_h0=ingenic_add_h(sum_h0,vrd2);
[0052]
sum_h0=ingenic_add_h(sum_h0,vrd3);
[0053]
sum_h0=ingenic_add_h(sum_h0,vrd4);
[0054]
sum_h0=ingenic_add_h(sum_h0,vrd5);
[0055]
sum_h0=ingenic_add_h(sum_h0,vrd6);
[0056]
sum_h0=ingenic_add_h(sum_h0,vrd7);
[0057]
sum_h0=ingenic_add_h(sum_h0,vrd8);
[0058]
sum_h0=ingenic_add_h(sum_h0,vrd9);
[0059]
sum_h0=ingenic_add_h(sum_h0,vrd10);
[0060]
sum_h0=ingenic_add_h(sum_h0,vrd11);
[0061]
sum_h0=ingenic_add_h(sum_h0,vrd12);
[0062]
sum_h0=ingenic_add_h(sum_h0,vrd13);
[0063]
sum_h0=ingenic_add_h(sum_h0,vrd14);
[0064]
sum_h0=ingenic_add_h(sum_h0,vrd15)。
[0065]
所述步骤s5中,进一步包括右移移位指令,将变量sum_h0里的每个元素进行移位,移动8位,输出sum_h1,该指令具有四舍五入的运算,count再累加1:
[0066]
sum_h1=ingenic_shift_right(sum_h0,8);
[0067]
count+=1。
[0068]
由此,本技术的优势在于:提供了一种灰色图求均值的方法。采用最高16bit的运算,一条simd指令可以实现8个数据的累加。与采用最高32bit的累加,一条simd指令实现4个数据累加,速度很慢。在预处理中,使用了更少的处理,只有一步16个8比特数据转化为两个寄存器中8个16比特数据的处理。中间处理使用移位代替均值除法,当累加个数达到256时,进行一次移位处理,等价把最终的均值平均到每次256的均值中,从而实现最高16比特的运算并求取均值。在加载数据中,采用一次加载128个数据,既能充分利用拥有的寄存器,又能充分利用带宽加载的数据,提高整体速度。128个数据,处理数据中也更加容易。在速度上,对相应的指令集进行优化处理,实现速度提升40倍。
附图说明
[0069]
此处所说明的附图用来提供对本发明的进一步理解,构成本技术的一部分,并不构成对本发明的限定。
[0070]
图1是本发明的方法流程图。
具体实施方式
[0071]
为了能够更清楚地理解本发明的技术内容及优点,现结合附图对本发明进行进一步的详细说明。
[0072]
本技术整体方法或者说是核心思想,可以在任何具有simd指令的芯片上实现。不同芯片会有些细节的差别,个别指令有所不同,或是指令寄存器运算位数不同,或是多条指令复合使用实现该方法中的一条指令。每款芯片指令会有差别,加法减法,乘法,移位,一般会一样,但具体的芯片会有独特功能的指令,所以指出具体复现该发明的芯片。
[0073]
本技术的具体实施例采用的是在北京君正t30、t31型号芯片上实现,在该芯片上能够完全复现本方法的实现。
[0074]
如图1所示,本发明涉及一种灰度图图像均值预处理的优化方法,所述方法进一步包括:
[0075]
s1,初始化和使用的变量寄存器声明:设vri0为将8bit寄存器中的前8个数据转化为16bit的选择寄存器,vri1为将8bit寄存器中的后8个数据转化为16bit的选择寄存器;
[0076]
预处理的数据为indata,数据宽为width,长为height,数据总数为piel_count=width*height;
[0077]
设一个数据组为vsave[8],一个常规临时变量sum_int,均值为avg,统计sum_h1累加次数的计算器count,初始为0;
[0078]
s2,加载128个图像数据到vrd0,vrd1,vrd2,vrd3,vrd4,vrd5,vrd6,vrd7,vrd8,vrd9,vrd10,vrd11,vrd12,vrd13,vrd14,vrd15,然后在对indata指针进行变化,即indata=indata+128;
[0079]
s3,使用设置好的选择顺序实现对数据由8bit转化为16bit,由于在指令集中没有实现将8bit直接转化为16bit的指令,所以需要使用任意取值指令实现该功能,也就是设置两个选择的寄存器vri0,vri1,并对里面的具体选择顺序预先设计好;
[0080]
s4,使用一个寄存器sum_h0进行16bit数据的累加,第一次累计和需要初始化时,sum_h0内数据为0;
[0081]
s5,重复步骤s2、s3、s4,直到循环次数达到256次时,对sum_h0进行移位处理,再将处理后结果累加到sum_h1中,最后将sum_h0内的数据置0,同时count加1;
[0082]
s6,重复步骤s2、s3、s4、s5,直到循环次数达到256次时,将sum_h1保存到vsave[8]中,对vsave[8]的数据进行求和为sum_int,sum_h1内的数据置为0;重复步骤s2、s3、s4、s5,直至所有数据计算完;
[0083]
s7,求均值:所述将sum_h1的数据保存到vsave[8]中,对vsave[8]的数据进行求和为sum_int,累加的次数为count,则均值为:avg=sum_int/count。
[0084]
具体地,本实施例还可以描述如下:
[0085]
1、使用要求。这是在北京君正t30,t31芯片上使用,使用普通的均值计算,速度很慢,严重影响整体的运行速度。使用t30、t31相应的指令集进行优化处理,实现速度提升40倍。处理的目标的长*宽为2048的倍数,这里图像均值预处理要求的精度误差在1以内。使用的t30、t31相应的指令集有加法指令、移位指令、任意取值指令、除法指令、加载数据指令。指令如下:
[0086]
a)加法指令:
[0087]
vrd=ingenic_add_h(vrs,vrt);
[0088]
输入变量vrs,vrt,输出变量是vrd。vrd存储的是8个int16_t的数据,vrs和vrt存储的是8个int16_t数据。
[0089]
等价的运算:
[0090]
vrd0:=vrs0+vrt0;
[0091]
vrd1:=vrs1+vrt1;
[0092]
……
[0093]
vrd7:=vrs7+vrt7;
[0094]
b)移位指令:将变量里的每个元素进行移位,移动i位。该指令具有四舍五入的运算。
[0095]
左移移位指令
[0096]
vrd=ingenic_shift_left(vrs,i);
[0097]
右移移位指令
[0098]
vrd=ingenic_shift_right(vrs,i);
[0099]
c)任意取值指令:从变量vrs和vrt中根据vri设置的编号选择出4个或8个或16个数据,在使用该指令时,需要占有一个永久寄存器vri,用于指令选择具体位置的数据。
[0100]
vrd=ingenic_choise_h(vrs,vrt,vri);
[0101]
d)除法指令:
[0102]
vrd=ingenic_div_d(vrs,vrt);
[0103]
输入变量vrs,vrt,输出变量是vrd寄存器。vrd存储的是16个int8_t的数据,vrs和vrt存储的是16个int8_t数据。结果按照四舍五入方式取值。
[0104]
等价的运算:
[0105]
vrd0:=vrs0/vrt0;
[0106]
vrd1:=vrs1/vrt1;
[0107]
……
[0108]
vrd7:=vrs7/vrt7;
[0109]
……
[0110]
vrd15:=vrs15/vrt15;
[0111]
e)加载数据指令:输入的待载入的数据,当前是数据的指针indata,从该数据indata在内存里指向的位置m开始加载128bit的数据,如果是8bit的数据是加载16个,如果是16bit数据加载8个,如果是32bit,加载4个数据。数据加载到变量vrd寄存器中。其中m是按照byte,即8bit为一个单位计算。
[0112]
vrd=ingenic_load(indata,m);
[0113]
f)保存数据指令:待保存数据的寄存器变量vrd,存储数据的指针savedata,从该指针位置开始存储寄存器里的数据。将vrd里面的128bit数据存储到savedata。
[0114]
ingenic_save(vrd,savedata,m)。
[0115]
2、计算均值。
[0116]
1)对于灰度图,我们每次加载128个图像数据,一个寄存器可以加载16个8bit数据,使用8个变量寄存器中,分别为vrd0,vrd2,vrd4,vrd6,vrd8,vrd10,vrd12,vrd14。再将加载的寄存器数据转化为16比特,也就是使用16个寄存器存储数据,对上面的变量寄存器进行复用,再增加8个变量寄存器,这里会生成vrd0,vrd1,

,vrd7,vrd8,

,vrd15。使用一个寄存器sum_h0进行16bit数据的累加,当sum_h0累加到256次时,对数据进行右移位8位,等价计算为除以256,再使用一个寄存器sum_h1对移位后的sum_h0进行累加,而sum_h0初始化为0,再重新累加加载的新的数据。使用sum_h1对对移位后的sum_h0进行累加,sum_h1累加到256次时,将sum_h1的结果保存到一个数组中。最后将数组的数据,再进行累加,再求均值。具体实现如下:
[0117]
使用的变量寄存器的声明:vrd0,vrd1,

,vrd7,vrd8,

,vrd15,sum_h0,sum_h1。设vri0为将8bit寄存器中的前8个数据转化为16bit的选择寄存器,vri1为将8bit寄存器中的后8个数据转化为16bit的选择寄存器。预处理的数据为indata,数据宽为width,长为height,数据总数为piel_count=width*height。设一个数据组为vsave[8],一个常规临时变量sum_int,均值为avg,统计sum_h1累加次数的计算器count,初始为0。
[0118]
a)加载128个图像数据到vrd0,vrd1,

,vrd7,vrd8,

,vrd15。然后在对indata指针进行变化,indata=indata+128,使用加载数据指令,输入的待载入的数据,当前是数据的指针indata,从该数据indata在内存里指向的位置0、16、32、48、64、80、96、112开始加载128bit的数据,如果是8bit的数据是加载16个,如果是16bit数据加载8个,如果是32bit,加载4个数据,数据加载到变量
[0119]
vrd0,vrd2,......,vrd12,vrd14寄存器中,表示如下:
[0120]
vrd0=ingenic_load(indata,0);
[0121]
vrd2=ingenic_load(indata,16);
[0122]
vrd4=ingenic_load(indata,32);
[0123]
vrd6=ingenic_load(indata,48);
[0124]
vrd8=ingenic_load(indata,64);
[0125]
vrd10=ingenic_load(indata,80);
[0126]
vrd12=ingenic_load(indata,96);
[0127]
vrd14=ingenic_load(indata,112);
[0128]
indata=indata+128;
[0129]
b)使用设置好的选择顺序实现对数据由8bit转化为16bit。由于在指令集中没有可以实现将8bit直接转化为16bit的指令,所以需要使用任意取值指令实现该功能。也就是设置两个选择的寄存器vri0,vri1;并对里面的具体选择顺序预先设计好;使用任意取值指令,表示如下:
[0130]
vrd1=ingenic_choise_h(vrd0,vrd0,vri1);
[0131]
使用任意取值指令,从变量vrd0和vrd0中根据vri1设置的编号选择出数据,存储于vrd1;以下任意取值指令,以此类推,不再累述。
[0132]
vrd0=ingenic_choise_h(vrd0,vrd0,vri0);
[0133]
vrd3=ingenic_choise_h(vrd2,vrd2,vri1);
[0134]
vrd2=ingenic_choise_h(vrd2,vrd2,vri0);
[0135]
vrd5=ingenic_choise_h(vrd4,vrd4,vri1);
[0136]
vrd4=ingenic_choise_h(vrd4,vrd4,vri0);
[0137]
vrd7=ingenic_choise_h(vrd6,vrd6,vri1);
[0138]
vrd6=ingenic_choise_h(vrd6,vrd6,vri0);
[0139]
vrd9=ingenic_choise_h(vrd8,vrd8,vri1);
[0140]
vrd8=ingenic_choise_h(vrd8,vrd8,vri0);
[0141]
vrd11=ingenic_choise_h(vrd10,vrd10,vri1);
[0142]
vrd10=ingenic_choise_h(vrd10,vrd10,vri0);
[0143]
vrd13=ingenic_choise_h(vrd12,vrd12,vri1);
[0144]
vrd12=ingenic_choise_h(vrd12,vrd12,vri0);
[0145]
vrd15=ingenic_choise_h(vrd14,vrd14,vri1);
[0146]
vrd14=ingenic_choise_h(vrd14,vrd14,vri0);
[0147]
c)使用一个寄存器sum_h0进行16bit数据的累加,第一次累计和需要初始化时,sum_h0内数据为0,使用加法指令,表示如下:
[0148]
sum_h0=ingenic_add_h(sum_h0,vrd0);
[0149]
使用加法指令,输入变量输入变量sum_h0、vrd0,输出变量是sum_h0存储的是8个int16_t的数据,sum_h0和vrd0存储的是8个int16_t数据;以下加法指令,以此类推,不再累述。
[0150]
sum_h0=ingenic_add_h(sum_h0,vrd1);
[0151]
……
[0152]
sum_h0=ingenic_add_h(sum_h0,vrd15);
[0153]
d)重复a),b),c)直到循环次数达到256次时,对sum_h0进行移位处理,再将处理后结果累加到sum_h1中,最后将sum_h0内的数据置0,同时count加一
[0154]
sum_h1=ingenic_shift_right(sum_h0,8);
[0155]
count+=1;
[0156]
e)重复a),b),c),d),直到循环次数达到256次时,将sum_h1保存到vsave[8]中,对vsave[8]的数据进行求和为sum_int,sum_h1内的数据置为0,重复a),b),c),d),直至所有数据计算完。
[0157]
f)将sum_h1保存到vsave[8]中,对vsave[8]的数据进行求和为sum_int.累加的次数为count,
[0158]
avg=sum_int/count。
[0159]
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1