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

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

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


背景技术:

2.在现有的图像处理技术中,图像处理的图像有两种情况,灰度图和彩色图,由于彩色图与灰色图的不同,使用灰色图的处理方法无法处理彩色图,对于结果处理,彩色图也是不同与灰度图的处理方法。在处理过程中经常会使用累加和求均值的方法,但是普通的加和、普通的均值计算,速度会很慢,例如北京君正t30、t31型号的芯片,计算均值的速度会拖延整体的运行速度。这个时间增加,导致增大整体的时间。使用普通的一个数一个数的累加,可以理解为c的一种实现,一般simd指令无法实现连续累加,没有相关的simd实现方法。对于彩色图累加,一般是对同一个通道的数据进行累加,跳跃着累加。simd实现更难,而且没有跳跃累加。
3.另外,现有技术中的常用术语如下:
4.1、均值:均值一般指平均数。平均数,统计学术语,是表示一组数据集中趋势的量数,是指在一组数据中所有数据之和再除以这组数据的个数。它是反映数据集中趋势的一项指标。解答平均数应用题的关键在于确定“总数量”以及和总数量对应的总份数。
5.2、rgb彩色图:有三个通道的图像,三个像素是按照rgb顺序存储。
6.3、simd指令(singleinstructionmultipledata),即一种以向量方式计算的指令。单指令流多数据流,也就是说一次运算指令可以执行多个数据流,这样在很多时候可以提高程序的运算速度。simd指令可以理解为运行一次指令,运行指定大小数组的运算。128bit的simd指令,数组大小是用128bit定义,放16个8bit数据,或放4个32比特数据,或放8个16bit数据。例如“两个数组”相加,一条simd指令直接就得到。


技术实现要素:

7.为了解决上述现有技术中的问题,本技术的目的在于:提高计算均值的速度。可以实现40倍的提升。
8.具体地,本发明提供一种彩色图图像均值预处理的优化方法,所述方法针对rgb彩色图,每次加载64*3个图像数据,一个寄存器加载16个8bit数据,使用12个变量寄存器,分别为vrdr0,vrdg0,vrdb0,vrdr1,vrdg1,vrdb1,vrdr2,vrdg2,vrdb2,vrdr3,vrdg3,vrdb3;再将加载的寄存器数据转化为16比特,增加6个中间转化的寄存器vrd_r0、vrd_r1,vrd_g0、vrd_g1,vrd_b0、vrd_b1,将vrdr0,vrdg0,vrdb0,转化为vrd_r0、vrd_r1,vrd_g0、vrd_g1,vrd_b0、vrd_b1,使用3个寄存器sum_hr0,sum_hg0sum_hb0进行16bit数据的累加,累加后,再对vrdr1,vrdg1,vrdb1,vrdr2,vrdg2,vrdb2,vrdr3,vrdg3,vrdb3进行转化和累加;当sum_hr0,sum_hg0 sum_hb0累加到256次时,对数据进行右移位8位,等价计算为除以256,再使用3个寄存器sum_hr1、sum_hg1、sum_hb1对移位后的sum_hr0、sum_hg0、sum_hb0进行累
加,而sum_hr0、sum_hg0、sum_hb0初始化为0,再重新累加加载的新的数据;使用sum_hr1、sum_hg1、sum_hb1对移位后的sum_hr0、sum_hg0、sum_hb0进行累加,sum_hr1、sum_hg1、sum_hb1累加到256次时,将sum_hr1、sum_hg1、sum_hb1的结果保存到三个数组中;最后将三个数组的数据,再进行累加,再求rgb每个通道的均值。
9.所述方法进一步包括:
10.s1,初始化和使用的变量寄存器声明:
11.设vri0为将8bit寄存器中的前8个数据转化为16bit的选择寄存器,vri1为将8bit寄存器中的后8个数据转化为16bit的选择寄存器;
12.预处理的数据为indata,数据宽为width,长为height,数据总数为piel_count=width*height;
13.设一个数据组为vsave[3][8],一个常规临时变量sum_intr,sum_intg,sum_intb,均值为avgr,avgg,avgb,统计sum_hr1、sum_hg1、sum_hb1累加次数的计算器count,初始为0;
[0014]
s2,加载64*3个图像数据到vrdr0,vrdg0,vrdb0,vrdr1,vrdg1,vrdb1,vrdr2,vrdg2,vrdb2,vrdr3,vrdg3,vrdb3,然后再对indata指针进行变化,即indata=indata+64*3;
[0015]
s3,使用设置好的选择顺序实现对数据由8bit转化为16bit,即设置两个选择的寄存器vri0,vri1,并对里面的具体选择顺序预先设计好;转化16bit的寄存器为vrd_r1、vrd_r0、vrd_g1、vrd_g0、vrd_b1、vrd_b0;使用3个寄存器sum_hr0,sum_hg0,sum_hb0进行16bit数据vrd_r1、vrd_r0、vrd_g1、vrd_g0、vrd_b1、vrd_b0的累加;累加后,再对vrdr1,vrdg1,vrdb1,vrdr2,vrdg2,vrdb2,vrdr3,vrdg3,vrdb3进行转化为16bit,再进行累加,第一次累计和需要初始化时,sum_hr0,sum_hg0,sum_hb0内数据为0;
[0016]
s4,重复步骤s2、s3直到循环次数达到256次时,对sum_hr0,sum_hg0,sum_hb0进行移位处理,再将处理后结果累加到sum_hr1,sum_hg1,sum_hb1中,最后将sum_hr0,sum_hg0,sum_hb0内的数据置0,同时count加1;
[0017]
s5,重复步骤s2、s3、s4,直到循环次数达到256次时,将sum_hr1,sum_hg1,sum_hb1保存到vsave[0][8],vsave[1][8],vsave[2][8],中,对vsave的数据进行求和为sum_intr,sum_intg,sum_intb;sum_hr1,sum_hg1,sum_hb1内的数据置为0,重复步骤s2、s3、s4,直至所有数据计算完;
[0018]
s6,将sum_hr1,sum_hg1,sum_hb1保存到vsave[0][8],vsave[1][8],vsave[2][8]中,对vsave的数据进行求和为sum_intr,sum_intg,sum_intb.累加的次数为count;
[0019]
s7,求均值:求和除以累加的次数。
[0020]
所述方法应用于具有simd指令的芯片,对相应的指令集进行优化处理,处理的目标的长*宽为2048的倍数的图像,这里图像均值预处理要求的精度误差在1以内,使用的相应的指令集有加法指令、移位指令、任意取值指令、除法指令、加载数据指令、保存数据指令。
[0021]
本技术整体方法或者说是核心思想,可以在具有simd指令的芯片上实现,只是会有些细节的差别,可能有的指令没有,或是有些两条实现的指令在其他芯片上用一条其他指令可以实现。每款芯片指令会有差别,正常的加法减法,乘法,移位,一般会一样,但具体
的芯片会有独特功能的指令,所以指出列应用的芯片。
[0022]
所述方法应用于北京君正t30、t31型号芯片。
[0023]
所述的加法指令、移位指令、任意取值指令、除法指令、加载数据指令、保存数据指令,如下:
[0024]
a)加法指令:
[0025]
vrd=ingenic_add_h(vrs,vrt);
[0026]
输入变量vrs,vrt,输出变量是vrd;vrd存储的是8个int16_t的数据,vrs和vrt存储的是8个int16_t数据;
[0027]
等价的运算:
[0028]
vrd0:=vrs0+vrt0;
[0029]
vrd1:=vrs1+vrt1;
[0030]
……
[0031]
vrd7:=vrs7+vrt7;
[0032]
b)移位指令:将变量里的每个元素进行移位,移动i位;
[0033]
左移移位指令
[0034]
vrd=ingenic_shift_left(vrs,i)
[0035]
右移移位指令
[0036]
vrd=ingenic_shift_right(vrs,i);
[0037]
c)任意取值指令:从变量vrs和vrt中根据vri设置的编号选择出4个或8个或16个数据,在使用该指令时,需要占有一个永久寄存器vri,用于指令选择具体位置的数据;
[0038]
vrd=ingenic_choise_h(vrs,vrt,vri);
[0039]
d)除法指令:
[0040]
vrd=ingenic_div_d(vrs,vrt);
[0041]
输入变量vrs,vrt,输出变量是vrd寄存器;vrd存储的是16个int8_t的数据,vrs和vrt存储的是16个int8_t数据;结果按照四舍五入方式取值;
[0042]
等价的运算:
[0043]
vrd0:=vrs0/vrt0;
[0044]
vrd1:=vrs1/vrt1;
[0045]
……
[0046]
vrd7:=vrs7/vrt7;
[0047]
……
[0048]
vrd15:=vrs15/vrt15;
[0049]
e)加载数据指令:输入的待载入的数据,当前是数据的指针indata,从该数据indata在内存里指向的位置m开始加载128bit的数据,如果是8bit的数据是加载16个,如果是16bit数据加载8个,如果是32bit,加载4个数据;数据加载到变量vrd寄存器中;其中m是按照byte,即8bit为一个单位计算,
[0050]
vrd=ingenic_load(indata,m);
[0051]
f)保存数据指令:待保存数据的寄存器变量vrd,存储数据的指针savedata,从该指针位置开始存储寄存器里的数据,将vrd里面的128bit数据存储到savedata,
[0052]
ingenic_save(vrd,savedata,m)。
[0053]
所述步骤s2中,对indata指针进行变化,进一步包括加载数据指令:待载入的数据为指针indata指向的数据,从该指针indata指向的位置0,16,
……
,160,176依次开始加载128bit的数据,如果是8bit的数据是加载16个,如果是16bit数据加载8个,如果是32bit,加载4个数据;数据加载到变量vrdri,vrdgi,vrdbi寄存器中,其中,i=0,1,2,3,表示为:
[0054]
vrdr0=ingenic_load(indata,0)
[0055]
vrdg0=ingenic_load(indata,16)
[0056]
vrdb0=ingenic_load(indata,32)
[0057]
vrdr1=ingenic_load(indata,48)
[0058]
vrdg1=ingenic_load(indata,64)
[0059]
vrdb1=ingenic_load(indata,80)
[0060]
vrdr2=ingenic_load(indata,96)
[0061]
vrdg2=ingenic_load(indata,112)
[0062]
vrdb2=ingenic_load(indata,128)
[0063]
vrdr3=ingenic_load(indata,144)
[0064]
vrdg3=ingenic_load(indata,160)
[0065]
vrdb3=ingenic_load(indata,176)
[0066]
indata=indata+64*3。
[0067]
所述步骤s3,进一步包括任意取值指令:分别从变量vrdrm和vrdrn,vrdgm和vrdgn,vrdbm和vrdbn中根据vrij设置的编号选择出4个或8个或16个数据,输出vrd_r1,vrd_r0,vrd_g1,vrd_g0,vrd_b1,vrd_b0;还包括加法指令,输入变量分别为sum_hr0,sum_hg0,sum_hr0和任意取值指令的输出,输出变量分别是sum_hr0,sum_hg0,sum_hr0;其中,m,n分别为0,1,2,3,j为1,0:
[0068]
vrd_r1=ingenic_choise_h(vrdr0,vrdr0,vri1)
[0069]
vrd_r0=ingenic_choise_h(vrdr0,vrdr0,vri0)
[0070]
vrd_g1=ingenic_choise_h(vrdg0,vrdg0,vri1)
[0071]
vrd_g0=ingenic_choise_h(vrdg0,vrdg0,vri0)
[0072]
vrd_b1=ingenic_choise_h(vrdb0,vrdb0,vri1)
[0073]
vrd_b0=ingenic_choise_h(vrdb0,vrdb0,vri0)
[0074]
sum_hr0=ingenic_add_h(sum_hr0,vrd_r0);
[0075]
sum_hr0=ingenic_add_h(sum_hr0,vrd_r1);
[0076]
sum_hg0=ingenic_add_h(sum_hg0,vgd_g0);
[0077]
sum_hg0=ingenic_add_h(sum_hg0,vgd_g1);
[0078]
sum_hb0=ingenic_add_h(sum_hb0,vgd_b0);
[0079]
sum_hb0=ingenic_add_h(sum_hb0,vgd_b1);
[0080]
……
[0081]
vrd_r1=ingenic_choise_h(vrdr3,vrdr3,vri1)
[0082]
vrd_r0=ingenic_choise_h(vrdr3,vrdr3,vri0)
[0083]
vrd_g1=ingenic_choise_h(vrdg3,vrdg3,vri1)
[0084]
vrd_g0=ingenic_choise_h(vrdg3,vrdg3,vri0)
[0085]
vrd_b1=ingenic_choise_h(vrdb3,vrdb3,vri1)
[0086]
vrd_b0=ingenic_choise_h(vrdb3,vrdb3,vri0)
[0087]
sum_hr0=ingenic_add_h(sum_hr0,vrd_r0);
[0088]
sum_hr0=ingenic_add_h(sum_hr0,vrd_r1);
[0089]
sum_hg0=ingenic_add_h(sum_hg0,vgd_g0);
[0090]
sum_hg0=ingenic_add_h(sum_hg0,vgd_g1);
[0091]
sum_hb0=ingenic_add_h(sum_hb0,vgd_b0);
[0092]
sum_hb0=ingenic_add_h(sum_hb0,vgd_b1)。
[0093]
所述步骤s4中,进一步包括右移位指令,将sum_hr0、sum_hg0、sum_hb0里的每个元素进行右移位,移动8位,再count加1:
[0094]
sum_hr1=ingenic_shift_right(sum_hr0,8)
[0095]
sum_hg1=ingenic_shift_right(sum_hg0,8)
[0096]
sum_hb1=ingenic_shift_right(sum_hb0,8)
[0097]
count+=1。
[0098]
所述步骤s7中,进一步包括:
[0099]
avgr=sum_intr/count;
[0100]
avgg=sum_intg/count;
[0101]
avgb=sum_intb/count。
[0102]
由此,本技术的优势在于:提供了一种rgb彩色图求均值的方法。在北京君正t30、t31型号芯片上使用,应用t30、t31芯片相应的指令集进行优化处理,实现速度提升40倍。处理的目标的长*宽为2048的倍数的图像,这里图像均值预处理要求的精度误差在1以内,满足实际应用要求。
附图说明
[0103]
此处所说明的附图用来提供对本发明的进一步理解,构成本技术的一部分,并不构成对本发明的限定。
[0104]
图1是本发明的方法流程图。
具体实施方式
[0105]
为了能够更清楚地理解本发明的技术内容及优点,现结合附图对本发明进行进一步的详细说明。
[0106]
具体实施例,是在北京君正t30 t31型号芯片上实现的,在该芯片上实现复现本技术的方法。处理方法的思想任何具有simd指令的芯片都可以使用。
[0107]
由于彩色图是rgbrgbrgbrgb
……
的存储方式,求均值是求r,g,b的三个各自均值,在处理上,直接累加无法实现,也就是使用灰度图处理方法无法处理彩色图。彩色图处理使用的寄存器个数必须是3的倍数,这是由rgb导致的,所以处理中使用12个寄存器加载数据。由于只有32个寄存器,中间处理需要寄存器,结果保存需要寄存器,同时还有一直占用的寄存器,所以设计上要最大程度的使用所有寄存器,由于初始加载最少是12个寄存器,要是再
增加,需要是12的倍数,当使用到24个时,由于中间还要使用寄存器,还有一些永久占有的寄存器,使用个数超过32个,也要留一些寄存器给其他使用,所以选择了12个寄存器初始加载数据。同时也不能变少,初始加载数据最少是12个寄存器。所以选择了12个寄存器。
[0108]
如图1所示,本发明涉及一种彩色图图像均值预处理的优化方法,所述方法包括:
[0109]
s1,初始化和使用的变量寄存器声明:
[0110]
设vri0为将8bit寄存器中的前8个数据转化为16bit的选择寄存器,vri1为将8bit寄存器中的后8个数据转化为16bit的选择寄存器;
[0111]
预处理的数据为indata,数据宽为width,长为height,数据总数为piel_count=width*height;
[0112]
设一个数据组为vsave[3][8],一个常规临时变量sum_intr,sum_intg,sum_intb,均值为avgr,avgg,avgb,统计sum_hr1、sum_hg1、sum_hb1累加次数的计算器count,初始为0;
[0113]
s2,加载64*3个图像数据到vrdr0,vrdg0,vrdb0,vrdr1,vrdg1,vrdb1,vrdr2,vrdg2,vrdb2,vrdr3,vrdg3,vrdb3,然后再对indata指针进行变化,即indata=indata+64*3;
[0114]
s3,使用设置好的选择顺序实现对数据由8bit转化为16bit,即设置两个选择的寄存器vri0,vri1,并对里面的具体选择顺序预先设计好;转化16bit的寄存器为vrd_r1、vrd_r0、vrd_g1、vrd_g0、vrd_b1、vrd_b0;使用3个寄存器sum_hr0,sum_hg0,sum_hb0进行16bit数据vrd_r1、vrd_r0、vrd_g1、vrd_g0、vrd_b1、vrd_b0的累加;累加后,再对vrdr1,vrdg1,vrdb1,vrdr2,vrdg2,vrdb2,vrdr3,vrdg3,vrdb3进行转化为16bit,再进行累加,第一次累计和需要初始化时,sum_hr0,sum_hg0,sum_hb0内数据为0;
[0115]
s4,重复步骤s2、s3直到循环次数达到256次时,对sum_hr0,sum_hg0,sum_hb0进行移位处理,再将处理后结果累加到sum_hr1,sum_hg1,sum_hb1中,最后将sum_hr0,sum_hg0,sum_hb0内的数据置0,同时count加1;
[0116]
s5,重复步骤s2、s3、s4,直到循环次数达到256次时,将sum_hr1,sum_hg1,sum_hb1保存到vsave[0][8],vsave[1][8],vsave[2][8],中,对vsave的数据进行求和为sum_intr,sum_intg,sum_intb;sum_hr1,sum_hg1,sum_hb1内的数据置为0,重复步骤s2、s3、s4,直至所有数据计算完;
[0117]
s6,将sum_hr1,sum_hg1,sum_hb1保存到vsave[0][8],vsave[1][8],vsave[2][8]中,对vsave的数据进行求和为sum_intr,sum_intg,sum_intb,累加的次数为count;
[0118]
s7,求均值:求和除以累加的次数。
[0119]
具体地,本实施例还可以描述如下:
[0120]
1、使用要求。所述方法是在北京君正t30,t31型号芯片上使用,如果使用普通的均值计算,速度很慢,严重影响整体的运行速度。使用t30、t31相应的指令集进行优化处理,实现速度提升40倍。处理的目标的长*宽为2048的倍数的图像,这里图像均值预处理要求的精度误差在1以内,满足实际应用要求。使用的t30、t31相应的指令集有加法指令、移位指令、任意取值指令、除法指令、加载数据指令。指令如下:
[0121]
a)加法指令:
[0122]
vrd=ingenic_add_h(vrs,vrt);
[0123]
输入变量vrs,vrt,输出变量是vrd。vrd存储的是8个int16_t的数据,vrs和vrt存储的是8个int16_t数据。
[0124]
等价的运算:
[0125]
vrd0:=vrs0+vrt0;
[0126]
vrd1:=vrs1+vrt1;
[0127]
……
[0128]
vrd7:=vrs7+vrt7;
[0129]
b)移位指令:将变量里的每个元素进行移位,移动i位。
[0130]
左移移位指令
[0131]
vrd=ingenic_shift_left(vrs,i)
[0132]
右移移位指令
[0133]
vrd=ingenic_shift_right(vrs,i)
[0134]
c)任意取值指令:从变量vrs和vrt中根据vri设置的编号选择出4个或8个或16个数据,在使用该指令时,需要占有一个永久寄存器vri,用于指令选择具体位置的数据。
[0135]
vrd=ingenic_choise_h(vrs,vrt,vri);
[0136]
输入变量vrs,vrt,vri,输出变量是vrd寄存器。根据vri指定的位置,将目标寄存器vrs和vrt中指定位置的数据写到另一个寄存器vrd中。这个指令使用涉及到存位置的寄存器vri,目标寄存器vrs,和vrt,一个存结果的寄存器vrd。
[0137]
d)除法指令:
[0138]
vrd=ingenic_div_d(vrs,vrt);
[0139]
输入变量vrs,vrt,输出变量是vrd寄存器。vrd存储的是16个int8_t的数据,vrs和vrt存储的是16个int8_t数据。结果按照四舍五入方式取值。
[0140]
等价的运算:
[0141]
vrd0:=vrs0/vrt0;
[0142]
vrd1:=vrs1/vrt1;
[0143]
……
[0144]
vrd7:=vrs7/vrt7;
[0145]
……
[0146]
vrd15:=vrs15/vrt15;
[0147]
e)加载数据指令:输入的待载入的数据,当前是数据的指针indata,从该数据indata在内存里指向的位置m开始加载128bit的数据,如果是8bit的数据是加载16个,如果是16bit数据加载8个,如果是32bit,加载4个数据。数据加载到变量vrd寄存器中。其中m是按照byte,即8bit为一个单位计算。
[0148]
vrd=ingenic_load(indata,m)
[0149]
f)保存数据指令:待保存数据的寄存器变量vrd,存储数据的指针savedata,从该指针位置开始存储寄存器里的数据。将vrd里面的128bit数据存储到savedata。
[0150]
ingenic_save(vrd,savedata,m)。
[0151]
2、计算均值。
[0152]
对于rgb彩色图,我们每次加载64*3个图像数据,一个寄存器可以加载16个8bit数
据,使用12个变量寄存器中,分别为vrdr0,vrdg0,vrdb0,vrdr1,vrdg1,vrdb1,vrdr2,vrdg2,vrdb2,vrdr3,vrdg3,vrdb3.再将加载的寄存器数据转化为16比特,增加六个中间转化的寄存器vrd_r0、vrd_r1,vrd_g0、vrd_g1,vrd_b0、vrd_b1,将vrdr0,vrdg0,vrdb0,转化为vrd_r0、vrd_r1,vrd_g0、vrd_g1,vrd_b0、vrd_b1,使用三个寄存器sum_hr0,sum_hg0 sum_hb0进行16bit数据的累加,累加后,对vrdr1,vrdg1,vrdb1,vrdr2,vrdg2,vrdb2,vrdr3,vrdg3,vrdb3进行转化和累加,当sum_hr0,sum_hg0 sum_hb0累加到256次时,对数据进行右移位8位,等价计算为除以256,再使用三个寄存器sum_hr1、sum_hg1、sum_hb1对移位后的sum_hr0、sum_hg0、sum_hb0进行累加,而sum_hr0、sum_hg0、sum_hb0初始化为0,再重新累加加载的新的数据。使用sum_hr1、sum_hg1、sum_hb1对移位后的sum_hr0、sum_hg0、sum_hb0进行累加,sum_hr1、sum_hg1、sum_hb1累加到256次时,将sum_hr1、sum_hg1、sum_hb1的结果保存到三个数组中.最后将三个数组的数据,再进行累加,再求rgb每个通道的均值。具体实现如下。
[0153]
使用的变量寄存器的声明:vrdr0,vrdg0,vrdb0,vrdr1,vrdg1,vrdb1,vrdr2,vrdg2,vrdb2,vrdr3,vrdg3,vrdb3;sum_hr0,sum_hg0,sum_hb0;sum_hr1、sum_hg1、sum_hb1。设vri0为将8bit寄存器中的前8个数据转化为16bit的选择寄存器,vri1为将8bit寄存器中的后8个数据转化为16bit的选择寄存器。预处理的数据为indata,数据宽为width,长为height,数据总数为piel_count=width*height。设一个数据组为vsave[3][8],一个常规临时变量sum_intr,sum_intg,sum_intb,均值为avgr,avgg,avgb,统计sum_hr1、sum_hg1、sum_hb1累加次数的计算器count,初始为0。
[0154]
由于彩色三通道的特点,在加载数据的寄存器的设计,寄存器个数是3的倍数,同时寄存器总数为32个,使用不能超过32个,否存在反复加载和存储数据,造成效率极低。所以在下面的算法优化设计中,需要转化好一组16bit数据,累加一次。在数据加载中,从ddr到缓存中,速度很慢,但从缓存到寄存器,速度非常快,缓存的数据不及时使用,将会被其他数据覆盖,所以我们使用了最多的加载数据的寄存器,将缓存的数据都加载出来,避免浪费。
[0155]
a)加载加载64*3个图像数据到vrdr0,vrdg0,vrdb0,vrdr1,vrdg1,vrdb1,vrdr2,vrdg2,vrdb2,vrdr3,vrdg3,vrdb3。然后在对indata指针进行变化,即indata=indata+64*3
[0156]
vrdr0=ingenic_load(indata,0)
[0157]
vrdg0=ingenic_load(indata,16)
[0158]
vrdb0=ingenic_load(indata,32)
[0159]
vrdr1=ingenic_load(indata,48)
[0160]
vrdg1=ingenic_load(indata,64)
[0161]
vrdb1=ingenic_load(indata,80)
[0162]
vrdr2=ingenic_load(indata,96)
[0163]
vrdg2=ingenic_load(indata,112)
[0164]
vrdb2=ingenic_load(indata,128)
[0165]
vrdr3=ingenic_load(indata,144)
[0166]
vrdg3=ingenic_load(indata,160)
[0167]
vrdb3=ingenic_load(indata,176)
[0168]
indata=indata+64*3
[0169]
b)使用设置好的选择顺序实现对数据由8bit转化为16bit。由于在指令集中没有可以实现将8bit直接转化为16bit的指令,所以需要使用任意取值指令实现该功能。也就是设置两个选择的寄存器vri0,vri1.并对里面的具体选择顺序预先设计好。转化16bit的寄存器为vrd_r1、vrd_r0、vrd_g1、vrd_g0、vrd_b1、vrd_b0。使用三个寄存器sum_hr0,sum_hg0,sum_hb0进行16bit数据vrd_r1、vrd_r0、vrd_g1、vrd_g0、vrd_b1、vrd_b0的累加。累加后,再对vrdr1,vrdg1,vrdb1,vrdr2,vrdg2,vrdb2,vrdr3,vrdg3,vrdb3进行转化为16bit,再进行累加,第一次累计和需要初始化时,sum_hr0,sum_hg0,sum_hb0内数据为0,
[0170]
vrd_r1=ingenic_choise_h(vrdr0,vrdr0,vri1)
[0171]
vrd_r0=ingenic_choise_h(vrdr0,vrdr0,vri0)
[0172]
vrd_g1=ingenic_choise_h(vrdg0,vrdg0,vri1)
[0173]
vrd_g0=ingenic_choise_h(vrdg0,vrdg0,vri0)
[0174]
vrd_b1=ingenic_choise_h(vrdb0,vrdb0,vri1)
[0175]
vrd_b0=ingenic_choise_h(vrdb0,vrdb0,vri0)
[0176]
sum_hr0=ingenic_add_h(sum_hr0,vrd_r0);
[0177]
sum_hr0=ingenic_add_h(sum_hr0,vrd_r1);
[0178]
sum_hg0=ingenic_add_h(sum_hg0,vgd_g0);
[0179]
sum_hg0=ingenic_add_h(sum_hg0,vgd_g1);
[0180]
sum_hb0=ingenic_add_h(sum_hb0,vgd_b0);
[0181]
sum_hb0=ingenic_add_h(sum_hb0,vgd_b1);
[0182]
……
[0183]
vrd_r1=ingenic_choise_h(vrdr3,vrdr3,vri1)
[0184]
vrd_r0=ingenic_choise_h(vrdr3,vrdr3,vri0)
[0185]
vrd_g1=ingenic_choise_h(vrdg3,vrdg3,vri1)
[0186]
vrd_g0=ingenic_choise_h(vrdg3,vrdg3,vri0)
[0187]
vrd_b1=ingenic_choise_h(vrdb3,vrdb3,vri1)
[0188]
vrd_b0=ingenic_choise_h(vrdb3,vrdb3,vri0)
[0189]
sum_hr0=ingenic_add_h(sum_hr0,vrd_r0);
[0190]
sum_hr0=ingenic_add_h(sum_hr0,vrd_r1);
[0191]
sum_hg0=ingenic_add_h(sum_hg0,vgd_g0);
[0192]
sum_hg0=ingenic_add_h(sum_hg0,vgd_g1);
[0193]
sum_hb0=ingenic_add_h(sum_hb0,vgd_b0);
[0194]
sum_hb0=ingenic_add_h(sum_hb0,vgd_b1);
[0195]
c)重复a),b)直到循环次数达到256次时,对sum_hr0,sum_hg0,sum_hb0进行移位处理,再将处理后结果累加到sum_hr1,sum_hg1,sum_hb1中,最后将sum_hr0,sum_hg0,sum_hb0内的数据置0,同时count加一
[0196]
sum_hr1=ingenic_shift_right(sum_hr0,8)
[0197]
sum_hg1=ingenic_shift_right(sum_hg0,8)
[0198]
sum_hb1=ingenic_shift_right(sum_hb0,8)
[0199]
count+=1
[0200]
d)重复a)、b)、c),直到循环次数达到256次时,将sum_hr1,sum_hg1,sum_hb1保存到vsave[0][8],vsave[1][8],vsave[2][8],中,对vsave的数据进行求和为sum_intr,sum_intg,sum_intb。sum_hr1,sum_hg1,sum_hb1内的数据置为0,重复a)、b)、c),直至所有数据计算完。
[0201]
e)将sum_hr1,sum_hg1,sum_hb1保存到vsave[0][8],vsave[1][8],vsave[2][8]中,对vsave的数据进行求和为sum_intr,sum_intg,sum_intb.累加的次数为count。
[0202]
avgr=sum_intr/count;
[0203]
avgg=sum_intg/count;
[0204]
avgb=sum_intb/count。
[0205]
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1