一种利用均值均衡图像像素的优化方法与流程

文档序号:33246455发布日期:2023-02-17 23:25阅读:38来源:国知局
一种利用均值均衡图像像素的优化方法与流程

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


背景技术:

2.在现有的图像处理技术中,经常会使用求均值的方法,但是普通的加和、普通的均值计算,速度会很慢,芯片的应用也因为需求不同所有不同,例如北京君正集成电路股份有限公司(简称:北京君正)的芯片,现有技术的方法应用于北京君正的t30、t31型号的芯片时,计算均值的速度会严重影响整体的运行速度。
3.现有技术中的常用术语如下:
4.1、均值:均值一般指平均数。平均数,统计学术语,是表示一组数据集中趋势的量数,是指在一组数据中所有数据之和再除以这组数据的个数。它是反映数据集中趋势的一项指标。解答平均数应用题的关键在于确定“总数量”以及和总数量对应的总份数。
5.2、特征图:输入数据通过卷积计算后得到的结果称之为特征图,数据通过全连接后生成的结果也称为特征图。特征图大小一般表示为长
×

×
深度,或1
×
深度。


技术实现要素:

6.为了解决上述现有技术中的问题,本技术的目的在于:提高芯片的计算均值的速度,特别是针对具有simd指令集的芯片的计算。
7.具体地,本发明提供一种利用均值均衡图像像素的优化方法,所述方法应用于具有simd指令集的芯片,对相应的指令集进行优化处理,处理的目标图像的长*宽为2048的倍数,使用乘法指令和移位指令实现等价的除法运算,即对数据采取乘以一个乘数再移动移位数的方法实现处理;通过计算出乘数和移位数,进而完成对灰度图或彩色图的优化操作。
8.所述方法进一步包括:
9.s1,计算记为mul的乘数和记为shift的移位数:
10.设均值为avgr,avgg,avgb,均衡的目标均值为avg0;
11.设sacle=avg0/avgr,循环次数为count,初始化count=0;
12.s1.1,如果sacle》1:则sacle=sacle/2;count=count+1;
13.否则,
14.mul=round(sacle*(256》》count)),即mul为通过round()函数返回的一个数值,该数值是sacle乘以(256右移count位)的结果;
15.shift=8-count;
16.s1.2,如果sacle《1:则sacle=sacle*2;count=count+1;
17.否则,
18.mul=round(sacle*(256《《count)),即mul为通过round()函数返回的一个数值,该数值是sacle*(256左移count位)的结果;
19.shift=8+count;
20.设预处理的一个值为a0,sacle=avg0/avgr;
21.设a2=(a0*mul)》》shift,即使用本方法求得值a2为(a0*mul)的数值右移shift位;
22.如果sacle》1,则
23.a2=={a0*[round(sacle*(256》》count))]}》》shift,即
[0024]
a2为a0乘以round()函数返回的数值后再右移shift位,所述返回的数值是sacle乘以(256右移count位)的结果;
[0025]
a2={round[a0*(sacle*(256》》count))]}》》shift,即
[0026]
a2为round()函数返回的数值后再右移shift位,所述返回的数值是a0乘以sacle乘以(256右移count位)的结果;
[0027]
a2=[round(a0*sacle*(256》》count))]》》(8-count),即
[0028]
a2为round()函数返回的数值后再右移(8-count)位,所述返回的数值是a0乘以sacle乘以(256右移count位)的结果;
[0029]
a2=[round(a0*sacle*256)]》》8,即
[0030]
a2为round()函数返回的数值后再右移8位,所述返回的数值是a0乘以sacle乘以256的结果;
[0031]
a2=round(a0*sacle),即
[0032]
a2为round()函数返回的一个数值,所述数值是a0乘以sacle的结果;
[0033]
如果sacle《1,则
[0034]
a2=={a0*[round(sacle*(256《《count))]}》》shift,即
[0035]
a2为a0乘以round()函数返回的数值后再右移shift位,所述返回的数值是sacle乘以(256左移count位)的结果;
[0036]
a2={round[a0*(sacle*(256《《count))]}》》shift,即
[0037]
a2为round()函数返回的数值后再右移shift位,所述返回的数值是a0乘以sacle乘以(256左移count位)的结果;
[0038]
a2=[round(a0*sacle*(256《《count))]》》(8+count),即
[0039]
a2为round()函数返回的数值后再右移(8+count)位,所述返回的数值是a0乘以sacle乘以(256左移count位)的结果;
[0040]
a2=[round(a0*sacle*256)]》》8,即
[0041]
a2为round()函数返回的数值后再右移8位,所述返回的数值是a0乘以sacle乘以256的结果;
[0042]
a2=round(a0*sacle),即
[0043]
a2为round()函数返回的数值,所述返回的数值是a0乘以sacle的结果;
[0044]
s1.3,sacle=1,灰度图不用计算,而彩色图,如果三个通道的sacle都为1,那么就不用计算,如果有一个不是1,那么就需要计算;
[0045]
s2,对图像进行优化处理;
[0046]
加载图像数据到变量寄存器,再对indata指针进行变化,使用设置好的选择顺序实现对数据由8bit转化为16bit;进行乘法运算和移位运算;使用设置好的选择顺序实现对
数据由16bit转化为8bit;对寄存器里的数据进行保存,保存到savedata里面,然后对savedata指针进行变化,重复上述步骤直到最后一个像素处理完。savedata是指针,创建好存储大小空间的首地址。通过指针的变化依次批量存放数据,完成一批数据存放后,savedata指针加存储数据的个数(即savedata=savedata+128或savedata=savedata+64*3),存放的是8比特的数据。
[0047]
所述步骤s2进一步包括,
[0048]
s2.1,对灰度图进行优化处理:设乘数为mul_0,移位数为shift_0;
[0049]
s2.1.1,加载128个图像数据到8个变量寄存器,再对indata指针进行变化,即indata=indata+128;
[0050]
s2.1.2,使用设置好的选择顺序实现对数据由8bit转化为16bit;
[0051]
s2.1.3,进行乘法运算和移位运算;
[0052]
s2.1.4,使用设置好的选择顺序实现对数据由16bit转化为8bit;
[0053]
s2.1.5,对寄存器里的数据进行保存,保存到savedata里面,然后对savedata指针进行变化,即savedata=savedata+128;savedata是指针,创建好存储大小空间的首地址。通过指针的变化依次批量存放数据,完成一批数据存放后,savedata指针变化(即savedata=savedata+128),存放的是8比特的数据。
[0054]
s2.1.6,重复s2.1.1,s2.1.2,s2.1.3,s2.1.4,s2.1.5,直到最后一个像素处理完。
[0055]
所述步骤s2进一步包括:
[0056]
s2.2,对彩色图进行优化处理:设计算得到的乘数为mul_r,mul_g,mul_b,移位数为shift_r,shitf_g,shitf_b;
[0057]
s2.2.1,加载64*3个图像数据到12个变量寄存器,再对indata指针进行变化,即indata=indata+64*3;
[0058]
s2.2.2,使用设置好的选择顺序实现对数据由8bit转化为16bit;再进行乘法指令运算和移位指令运算;将乘法运算和移位运算结果转化为8bit并存放到寄存器中;
[0059]
s2.2.3,对寄存器里的数据进行保存,保存到savedata里面,然后对savedata指针进行变化,即savedata=savedata+64*3;savedata是指针,创建好存储大小空间的首地址。通过指针的变化依次批量存放数据,完成一批数据存放后,savedata指针变化(即savedata=savedata+64*3),存放的是8比特的数据。
[0060]
s2.2.4,重复s2.2.1,s2.2.2,s2.2.3,直到最后一个像素处理完。
[0061]
所述步骤s2中灰度图的优化进一步包括:
[0062]
使用的变量寄存器的声明:vrd0,vrd1,

,vrd7;被乘数使用的寄存器vmul,里面存放8个一样的mul_0,是16bit的8个数据;移位数使用的寄存器为vshift,存放8个一样的shift_0;
[0063]
所述步骤s2.1.1进一步包括:
[0064]
vrd0=ingenic_load(indata,0);
[0065]
vrd2=ingenic_load(indata,16);
[0066]
vrd4=ingenic_load(indata,32);
[0067]
vrd6=ingenic_load(indata,48);
[0068]
vrd8=ingenic_load(indata,64);
[0069]
vrd10=ingenic_load(indata,80);
[0070]
vrd12=ingenic_load(indata,96);
[0071]
vrd14=ingenic_load(indata,112);
[0072]
indata=indata+128;
[0073]
所述步骤s2.1.2进一步包括,设置两个选择的寄存器vri0,vri1,并对里面的具体选择顺序预先设计好,
[0074]
vrd1=ingenic_choise_h(vrd0,vrd0,vri1);
[0075]
vrd0=ingenic_choise_h(vrd0,vrd0,vri0);
[0076]
vrd3=ingenic_choise_h(vrd2,vrd2,vri1);
[0077]
vrd2=ingenic_choise_h(vrd2,vrd2,vri0);
[0078]
vrd5=ingenic_choise_h(vrd4,vrd4,vri1);
[0079]
vrd4=ingenic_choise_h(vrd4,vrd4,vri0);
[0080]
vrd7=ingenic_choise_h(vrd6,vrd6,vri1);
[0081]
vrd6=ingenic_choise_h(vrd6,vrd6,vri0);
[0082]
vrd9=ingenic_choise_h(vrd8,vrd8,vri1);
[0083]
vrd8=ingenic_choise_h(vrd8,vrd8,vri0);
[0084]
vrd11=ingenic_choise_h(vrd10,vrd10,vri1);
[0085]
vrd10=ingenic_choise_h(vrd10,vrd10,vri0);
[0086]
vrd13=ingenic_choise_h(vrd12,vrd12,vri1);
[0087]
vrd12=ingenic_choise_h(vrd12,vrd12,vri0);
[0088]
vrd15=ingenic_choise_h(vrd14,vrd14,vri1);
[0089]
vrd14=ingenic_choise_h(vrd14,vrd14,vri0);
[0090]
s2.1.3进一步包括,进行乘法运算和移位运算,
[0091]
vrd0=ingenic_mul_h(vrd0,mul_0);
[0092]
vrd0=ingenic_shift_right(vrd0,shift_0);
[0093]
vrd1=ingenic_mul_h(vrd1,mul_0);
[0094]
vrd1=ingenic_shift_right(vrd1,shift_0);
[0095]
……
[0096]
vrd15=ingenic_mul_h(vrd15,mul_0);
[0097]
vrd15=ingenic_shift_right(vrd15,shift_0);
[0098]
s2.1.4进一步包括,设置一个选择的寄存器vri2,并对里面的具体选择顺序预先设计好,
[0099]
vrd0=ingenic_choise_h(vrd0,vrd1,vri2);
[0100]
vrd2=ingenic_choise_h(vrd2,vrd3,vri2);
[0101]
vrd4=ingenic_choise_h(vrd4,vrd5,vri2);
[0102]
vrd6=ingenic_choise_h(vrd6,vrd7,vri3);
[0103]
vrd8=ingenic_choise_h(vrd8,vrd9,vri2);
[0104]
vrd10=ingenic_choise_h(vrd10,vrd11,vri2);
[0105]
vrd12=ingenic_choise_h(vrd12,vrd13,vri2);
[0106]
vrd14=ingenic_choise_h(vrd14,vrd15,vri2);
[0107]
所述步骤s2.1.5,对vrd0,vrd2,

,vrd14寄存器里的数据进行保存,保存到savedata里面,然后对savedata指针进行变化,即savedata=savedata+128
[0108]
ingenic_save(vrd0,savedata,0);
[0109]
ingenic_save(vrd2,savedata,16);
[0110]
ingenic_save(vrd4,savedata,32);
[0111]
ingenic_save(vrd6,savedata,48);
[0112]
ingenic_save(vrd8,savedata,64);
[0113]
ingenic_save(vrd10,savedata,80);
[0114]
ingenic_save(vrd12,savedata,96);
[0115]
ingenic_save(vrd14,savedata,112);
[0116]
savedata=savedata+128。
[0117]
所述步骤s2中的彩色图,进一步包括:
[0118]
使用的变量寄存器的声明:vrd0,vrd1,vrd2,vrd3,vrd4,vrd5,vrd6,vrd7,vrd8,vrd9,vrd10,vrd11;被乘数使用的寄存器vmul_0,vmul_1,vmul_2;里面存放mul_r,mul_g,mul_b;移位数使用的寄存器为vshift_0,vshift_1,vshift_2,存放shift_r,shift_g,shift_b;由于彩色三通道的特点,在设计上使用寄存器上,是3的倍数,同时寄存器总数为32个,使用不能超过32个;
[0119]
vmul_0=[mul_r,mul_g,mul_b,mul_r,mul_g,mul_b,mul_r,mul_g];
[0120]
vmul_1=[mul_b,mul_r,mul_g,mul_b,mul_r,mul_g,mul_b,mul_r];
[0121]
vmul_2=[mul_g,mul_b,mul_r,mul_g,mul_b,mul_r,mul_g,mul_b];
[0122]
vshift_0=[shift_r,shift_g,shift_b,shift_r,shift_g,shift_b,shift_r,shift_g];
[0123]
vshift_1=[shift_b,shift_r,shift_g,shift_b,shift_r,shift_g,shift_b,shift_r];
[0124]
vshift_2=[shift_g,shift_b,shift_r,shift_g,shift_b,shift_r,shift_g,shift_b];
[0125]
所述步骤s2.2.1进一步包括,加载64*3个图像数据到vrd0,vrd1,

,vrd7,

,vrd11,然后再对indata指针进行变化,即indata=indata+64*3,表示如下:
[0126]
vrd0=ingenic_load(indata,0);
[0127]
vrd1=ingenic_load(indata,16);
[0128]
vrd2=ingenic_load(indata,32);
[0129]
vrd3=ingenic_load(indata,48);
[0130]
vrd4=ingenic_load(indata,64);
[0131]
vrd5=ingenic_load(indata,80);
[0132]
vrd6=ingenic_load(indata,96);
[0133]
vrd7=ingenic_load(indata,112);
[0134]
vrd8=ingenic_load(indata,128);
[0135]
vrd9=ingenic_load(indata,144);
[0136]
vrd10=ingenic_load(indata,160);
[0137]
vrd11=ingenic_load(indata,176);
[0138]
indata=indata+64*3;
[0139]
所述s2.2.2进一步包括,设两个选择的寄存器vri0,vri1,并对里面的具体选择顺序预先设计好;转化16bit的寄存器为vrd_r1、vrd_r0、vrd_g1、vrd_g0、vrd_b1、vrd_b0;然后再进行乘法指令运算和移位指令运算;将乘法运算结果和移位运算结果再保存到vrd_r1、vrd_r0、vrd_g1、vrd_g0、vrd_b1、vrd_b0中;再对vrd1,vrd1,vrd1,vrd2,vrd2,vrd2,vrd3,vrd3,vrd3进行转化为16bit,再进行乘法指令运算和移位指令运算:
[0140]
处理vrdr0、vrdg0、vrdb0如下:
[0141]
《1》8bit转化为16bit处理,表示如下:
[0142]
vrd_r1=ingenic_choise_h(vrd0,vrd0,vri1);
[0143]
vrd_r0=ingenic_choise_h(vrd0,vrd0,vri0);
[0144]
vrd_g1=ingenic_choise_h(vrd1,vrd1,vri1);
[0145]
vrd_g0=ingenic_choise_h(vrd1,vrd1,vri0);
[0146]
vrd_b1=ingenic_choise_h(vrd2,vrd2,vri1);
[0147]
vrd_b0=ingenic_choise_h(vrd2,vrd2,vri0);
[0148]
《2》乘法指令运算和移位指令运算,表示如下:
[0149]
vrd_r0=ingenic_mul_h(vrd_r0,vmul_0);
[0150]
vrd_r0=ingenic_shift_right(vrd_r0,vshift_0);
[0151]
vrd_r1=ingenic_mul_h(vrd_r0,vmul_1);
[0152]
vrd_r1=ingenic_shift_right(vrd_r1,vshift_1);
[0153]
vrd_g0=ingenic_mul_h(vrd_g0,vmul_2);
[0154]
vrd_g0=ingenic_shift_right(vrd_g0,vshift_2);
[0155]
vrd_g1=ingenic_mul_h(vrd_g1,vmul_0);
[0156]
vrd_g1=ingenic_shift_right(vrd_g1,vshift_0);
[0157]
vrd_b0=ingenic_mul_h(vrd_b0,vmul_1);
[0158]
vrd_b0=ingenic_shift_right(vrd_b0,vshift_1);
[0159]
vrd_b1=ingenic_mul_h(vrd_b1,vmul_2);
[0160]
vrd_b1=ingenic_shift_right(vrd_b1,vshift_2);
[0161]
《3》16bit转化为8bit处理,表示如下:
[0162]
vrd0=ingenic_choise_h(vrd_r0,vrd_r1,vri2);
[0163]
vrd1=ingenic_choise_h(vrd_g0,vrd_g1,vri2);
[0164]
vrd2=ingenic_choise_h(vrd_b0,vrd_b1,vri2);
[0165]
按照处理vrd0、vrd1、vrd2的方法处理vrd3、vrd4、vrd5;vrd6、vrd7、vrd8;vrd9、vrd10、vrd11;
[0166]
处理vrd9、vrd10、vrd11如下:
[0167]
《1》8bit转化为16bit处理,表示如下:
[0168]
vrd_r1=ingenic_choise_h(vrd9,vrd9,vri1);
[0169]
vrd_r0=ingenic_choise_h(vrd9,vrd9,vri0);
[0170]
vrd_g1=ingenic_choise_h(vrd10,vrd10,vri1);
[0171]
vrd_g0=ingenic_choise_h(vrd10,vrd10,vri0);
[0172]
vrd_b1=ingenic_choise_h(vrd11,vrd11,vri1);
[0173]
vrd_b0=ingenic_choise_h(vrd11,vrd11,vri0);
[0174]
《2》乘法指令运算和移位指令运算,表示如下:
[0175]
vrd_r0=ingenic_mul_h(vrd_r0,vmul_0);
[0176]
vrd_r0=ingenic_shift_right(vrd_r0,vshift_0);
[0177]
vrd_r1=ingenic_mul_h(vrd_r0,vmul_1);
[0178]
vrd_r1=ingenic_shift_right(vrd_r1,vshift_1);
[0179]
vrd_g0=ingenic_mul_h(vrd_g0,vmul_2);
[0180]
vrd_g0=ingenic_shift_right(vrd_g0,vshift_2);
[0181]
vrd_g1=ingenic_mul_h(vrd_g1,vmul_0);
[0182]
vrd_g1=ingenic_shift_right(vrd_g1,vshift_0);
[0183]
vrd_b0=ingenic_mul_h(vrd_b0,vmul_1);
[0184]
vrd_b0=ingenic_shift_right(vrd_b0,vshift_1);
[0185]
vrd_b1=ingenic_mul_h(vrd_b1,vmul_2);
[0186]
vrd_b1=ingenic_shift_right(vrd_b1,vshift_2);
[0187]
《3》16bit转化为8bit处理,表示如下:
[0188]
vrd9=ingenic_choise_h(vrd_r0,vrd_r1,vri2);
[0189]
vrd10=ingenic_choise_h(vrd_g0,vrd_g1,vri2);
[0190]
vrd11=ingenic_choise_h(vrd_b0,vrd_b1,vri2);
[0191]
所述步骤s2.2.3进一步包括,对vrd0,vrd1,

,vrd11寄存器里的数据进行保存,保存到savedata里面,然后对savedata指针进行变化,即savedata=savedata+64*3,表示如下:
[0192]
ingenic_save(vrd0,savedata,0);
[0193]
ingenic_save(vrd1,savedata,16);
[0194]
ingenic_save(vrd2,savedata,32);
[0195]
ingenic_save(vrd3,savedata,48);
[0196]
ingenic_save(vrd4,savedata,64);
[0197]
ingenic_save(vrd5,savedata,80);
[0198]
ingenic_save(vrd6,savedata,96);
[0199]
ingenic_save(vrd7,savedata,112);
[0200]
ingenic_save(vrd8,savedata,128);
[0201]
ingenic_save(vrd9,savedata,144);
[0202]
ingenic_save(vrd10,savedata,160);
[0203]
ingenic_save(vrd11,savedata,176);
[0204]
savedata=savedata+64*3。
[0205]
所述使用本方法求得a2的推导过程忽略了四舍五入的情况,但在允许四舍五入误差情况下,这种先乘以一个数,再移位的运算和乘以一个计算的浮点sacle一样的结果。
[0206]
所述方法特别适用于北京君正t30、t31型号芯片,复现该方法使用芯片为t30、t31型号芯片,其他芯片,由于指令集不一样,可能无法复现。
[0207]
由此,本技术的优势在于:提供了一种灰色图求均值的方法。在北京君正t30、t31型号芯片上使用,复现该方法使用芯片为t30、t31型号芯片,其他芯片,由于指令集不一样,可能无法复现,应用t30、t31芯片相应的指令集进行优化处理,实现速度提升40倍。处理的目标图像的长*宽为2048的倍数,这里图像均值预处理要求的精度误差在1以内,满足实际应用要求。数据的处理中,采用相乘一个特定的系数,再移位,从而达到将原本相加为32位的数据,控制在16比特的相加。由于数据的连续性,采用数据连续读取,实现数据加载的不浪费性使用。
附图说明
[0208]
此处所说明的附图用来提供对本发明的进一步理解,构成本技术的一部分,并不构成对本发明的限定。
[0209]
图1是本发明的方法流程图。
[0210]
图2是本发明方法的步骤s1的具体步骤流程图。
[0211]
图3是本发明方法的步骤s2的灰度图的优化步骤流程图。
[0212]
图4是本发明方法的步骤s2的彩色图的优化步骤流程图。
具体实施方式
[0213]
为了能够更清楚地理解本发明的技术内容及优点,现结合附图对本发明进行进一步的详细说明。
[0214]
本发明涉及一种利用均值均衡图像像素的优化方法,所述方法应用于具有simd指令集的芯片,对相应的指令集进行优化处理,处理的目标的长*宽为2048的倍数,使用乘法指令和移位指令实现等价的除法运算,即对数据采取乘以一个乘数再移动移位数的方法实现处理;通过计算出乘数和移位数,进而完成对灰度图或彩色图的优化操作。
[0215]
如图1所示,所述方法进一步包括:
[0216]
s1,计算记为mul的乘数和记为shift的移位数:
[0217]
设均值为avgr,avgg,avgb,均衡的目标均值为avg0;
[0218]
设sacle=avg0/avgr,循环次数为count,初始化count=0;
[0219]
如图2所示,步骤s1进一步包括:
[0220]
s1.1,如果sacle》1:则sacle=sacle/2;count=count+1;
[0221]
否则,
[0222]
mul=round(sacle*(256》》count)),即mul为通过round()函数返回的一个数值,该数值是sacle乘以(256右移count位)的结果;
[0223]
shift=8-count;
[0224]
s1.2,如果sacle《1:则sacle=sacle*2;count=count+1;
[0225]
否则,
[0226]
mul=round(sacle*(256《《count)),即mul为通过round()函数返回的一个数值,该数值是sacle*(256左移count位)的结果
[0227]
shift=8+count;
[0228]
设预处理的一个值为a0,sacle=avg0/avgr;
[0229]
设a2=(a0*mul)》》shift,即使用本方法求得值a2为(a0*mul)的数值右移shift位;
[0230]
如果sacle》1,则
[0231]
a2=={a0*[round(sacle*(256》》count))]}》》shift,即
[0232]
a2为a0乘以round()函数返回的数值后再右移shift位,所述返回的数值是sacle乘以(256右移count位)的结果;
[0233]
a2={round[a0*(sacle*(256》》count))]}》》shift,即
[0234]
a2为round()函数返回的数值后再右移shift位,所述返回的数值是a0乘以sacle乘以(256右移count位)的结果;
[0235]
a2=[round(a0*sacle*(256》》count))]》》(8-count),即
[0236]
a2为round()函数返回的数值后再右移(8-count)位,所述返回的数值是a0乘以sacle乘以(256右移count位)的结果;
[0237]
a2=[round(a0*sacle*256)]》》8,即
[0238]
a2为round()函数返回的数值后再右移8位,所述返回的数值是a0乘以sacle乘以256的结果;
[0239]
a2=round(a0*sacle),即
[0240]
a2为round()函数返回的一个数值,所述数值是a0乘以sacle的结果;
[0241]
如果sacle《1,则
[0242]
a2=={a0*[round(sacle*(256《《count))]}》》shift,即
[0243]
a2为a0乘以round()函数返回的数值后再右移shift位,所述返回的数值是sacle乘以(256左移count位)的结果;
[0244]
a2={round[a0*(sacle*(256《《count))]}》》shift,即
[0245]
a2为round()函数返回的数值后再右移shift位,所述返回的数值是a0乘以sacle乘以(256左移count位)的结果;
[0246]
a2=[round(a0*sacle*(256《《count))]》》(8+count),即
[0247]
a2为round()函数返回的数值后再右移(8+count)位,所述返回的数值是a0乘以sacle乘以(256左移count位)的结果;
[0248]
a2=[round(a0*sacle*256)]》》8,即
[0249]
a2为round()函数返回的数值后再右移8位,所述返回的数值是a0乘以sacle乘以256的结果;
[0250]
a2=round(a0*sacle),即
[0251]
a2为round()函数返回的数值,所述返回的数值是a0乘以sacle的结果;
[0252]
s1.3,sacle=1,灰度图不用计算,而彩色图,如果三个通道的sacle都为1,那么就不用计算,如果有一个不是1,那么就需要计算;
[0253]
s2,对图像进行优化处理;
[0254]
加载图像数据到变量寄存器,再对indata指针进行变化,使用设置好的选择顺序实现对数据由8bit转化为16bit;进行乘法运算和移位运算;使用设置好的选择顺序实现对
数据由16bit转化为8bit;对寄存器里的数据进行保存,保存到savedata里面,然后对savedata指针进行变化,重复上述步骤直到最后一个像素处理完。savedata是指针,创建好存储大小空间的首地址。通过指针的变化依次批量存放数据,完成一批数据存放后,savedata指针变化(即savedata=savedata+128或savedata=savedata+64*3),存放的是8比特的数据。
[0255]
如图3所示,所述步骤s2进一步包括,
[0256]
s2.1,对灰度图进行优化处理:设乘数为mul_0,移位数为shift_0;
[0257]
s2.1.1,加载128个图像数据到8个变量寄存器,再对indata指针进行变化,即indata=indata+128;
[0258]
s2.1.2,使用设置好的选择顺序实现对数据由8bit转化为16bit;
[0259]
s2.1.3,进行乘法运算和移位运算;
[0260]
s2.1.4,使用设置好的选择顺序实现对数据由16bit转化为8bit;
[0261]
s2.1.5,对寄存器里的数据进行保存,保存到savedata里面,然后对savedata指针进行变化,即savedata=savedata+128;
[0262]
s2.1.6,重复s2.1.1,s2.1.2,s2.1.3,s2.1.4,s2.1.5,直到最后一个像素处理完。
[0263]
如图4所示,所述步骤s2进一步包括:
[0264]
s2.2,对彩色图进行优化处理:设计算得到的乘数为mul_r,mul_g,mul_b,移位数为shift_r,shitf_g,shitf_b;
[0265]
s2.2.1,加载64*3个图像数据到12个变量寄存器,再对indata指针进行变化,即indata=indata+64*3;
[0266]
s2.2.2,使用设置好的选择顺序实现对数据由8bit转化为16bit;再进行乘法指令运算和移位指令运算;将乘法运算和移位运算结果转化为8bit并存放到寄存器中;
[0267]
s2.2.3,对寄存器里的数据进行保存,保存到savedata里面,然后对savedata指针进行变化,即savedata=savedata+64*3;
[0268]
s2.2.4,重复s2.2.1,s2.2.2,s2.2.3,直到最后一个像素处理完。
[0269]
具体地,本实施例还可以描述如下:
[0270]
1、使用要求。这是在君正t30,t31芯片,本实施例复现该方法使用芯片为t30、t31型号芯片,其他芯片,由于指令集不一样,可能无法复现;也就是说该方法复现必须在具有北京君正t30、t31型号芯片上相关指令才行。采用其他芯片,则相关指令需要改为对应的指令或多条指令一起实现。使用普通的均值计算,速度很慢,严重影响整体的运行速度。使用t30、t31相应的指令集进行优化处理,实现速度提升40倍。处理的目标图像的长*宽为2048的倍数,这里图像均值预处理要求的精度误差在1以内,满足实际应用要求。使用的t30、t31相应的指令集有加法指令、移位指令、任意取值指令、除法指令、加载数据指令。指令如下:
[0271]
a)移位指令:将变量里的每个元素进行移位,对应位置移动vri[i]位。这里的移位运算带有四舍五入的运算,vrs里面每个数据移位的多少与vri中数据对应。
[0272]
左移移位simd指令
[0273]
vrd=ingenic_vshift_left(vrs,vri)
[0274]
右移移位simd指令
[0275]
vrd=ingenic_vshift_right(vrs,vri)
[0276]
b)任意取值指令:从变量vrs和vrt中根据vri设置的编号选择出4个或8个或16个数据,在使用该指令时,需要占有一个永久寄存器vri,用于指令选择具体位置的数据。
[0277]
vrd=ingenic_choise_h(vrs,vrt,vri)
[0278]
c)加载数据指令:输入的待载入的数据,当前是数据的指针indata,从该数据indata在内存里指向的位置m开始加载128bit的数据,如果是8bit的数据是加载16个,如果是16bit数据加载8个,如果是32bit,加载4个数据。数据加载到变量vrd寄存器中。其中m是按照byte,即8bit为一个单位计算。
[0279]
vrd=ingenic_load(indata,m)
[0280]
d)保存数据指令:待保存数据的寄存器变量vrd,存储数据的指针savedata,从该指针位置开始存储寄存器里的数据。将vrd里面的128bit数据存储到savedata。m是按照byte,即8bit为一个单位计算。从该数据savedata在内存里指向的位置m开始加载128bit的数据.
[0281]
ingenic_save(vrd,savedata,m)
[0282]
e)乘法simd指令:
[0283]
vrd=ingenic_mul_h(vrs,vrt);
[0284]
输入变量vrs,vrt,输出变量是vrd。vrd存储的是8个int16_t的数据,vrs和vrt存储的是8个int16_t数据。
[0285]
等价的运算:
[0286]
vrd0:=vrs0*vrt0;
[0287]
vrd1:=vrs1*vrt1;
[0288]
……
[0289]
vrd7:=vrs7*vrt7;
[0290]
2、利用均值均衡图像像素。
[0291]
使用t30、t31相应的指令集,与非指令集相比较,可以实现速度提升15倍,这是直接对每个像素值除以均值,需要相应的除法指令,除法指令。但使用乘法指令和移位指令实现等价的除法运算,与非指令集相比较,可以实现速度提升50倍左右,这是由于除法指令是乘法指令时钟数的4倍,是移位时钟数的7倍。在这里,使用一个乘法指令和一个移位指令可以实现等价的除法指令。
[0292]
在实际应用中,这里的处理是预处理,对数据的精度要求不高,只要满足精度为1以内就可以,所以,从这个角度出发,我们对数据采取乘以一个数mul,再移位shift位的方法实现其运算。如果我们计算出乘以的具体数mul和移位数shift,就可以实现这个运算。具体实现如下。
[0293]
1)计算乘数mul和移位数shift
[0294]
设均值为avgr,avgg,avgb.均衡的目标均值为avg0。
[0295]
设sacle=avg0/avgr,循环次数为count,
[0296]
count=0
[0297]
如果sacle》1
[0298]
while(sacle》1){
[0299]
sacle=sacle/2;
[0300]
count++
[0301]
}
[0302]
mul=round(sacle*(256》》count));
[0303]
shift=8-count;
[0304]
如果sacle《1
[0305]
while(sacle《1){
[0306]
sacle=sacle*2;
[0307]
count++
[0308]
}
[0309]
mul=round(sacle*(256《《count));
[0310]
shift=8+count;
[0311]
设预处理的一个值为a0,正常求得值设为a1,sacle=avg0/avgr
[0312]
a1=round(a0*sacle)
[0313]
使用上述公式求得为a2,
[0314]
a2=(a0*mul)》》shift
[0315]
如果avg0/avgr》1
[0316]
a2=={a0*[round(sacle*(256》》count))]}》》shift
[0317]
a2={round[a0*(sacle*(256》》count))]}》》shift
[0318]
a2=[round(a0*sacle*(256》》count))]》》shift
[0319]
a2=[round(a0*sacle*(256》》count))]》》(8-count);
[0320]
a2=[round(a0*sacle*256)]》》8;
[0321]
a2=round(a0*sacle)
[0322]
如果avg0/avgr《1
[0323]
a2=={a0*[round(sacle*(256《《count))]}》》shift
[0324]
a2={round[a0*(sacle*(256《《count))]}》》shift
[0325]
a2=[round(a0*sacle*(256《《count))]》》shift
[0326]
a2=[round(a0*sacle*(256《《count))]》》(8+count);
[0327]
a2=[round(a0*sacle*256)]》》8;
[0328]
a2=round(a0*sacle)
[0329]
上面的推导过程忽略了四舍五入的情况。在允许四舍五入误差情况下,这种先乘以一个数,再移位的运算和乘以一个计算的浮点sacle一样的结果。
[0330]
如果是彩色图,设计算得到的乘数为mul_r,mul_g,mul_b,移位数为shift_r,shitf_g,shitf_b;
[0331]
如果是灰度图,设乘数为mul_0,移位数为shift_0。
[0332]
如果sacle=1,灰度图不用计算,而彩色图,如果三个通道的sacle都为1,那么就不用计算,如果有一个不是1,那么需要计算。
[0333]
2)灰度图的优化算法:
[0334]
使用的变量寄存器的声明:vrd0,vrd1,

,vrd7。被乘数使用的寄存器vmul。里面存放8个一样的mul_0,是16bit的8个数据。移位数使用的寄存器为vshift,存放8个一样的
shift_0。
[0335]
a)加载加载128个图像数据到vrd0,vrd1,

,vrd7。然后在对indata指针进行变化,即indata=indata+128;
[0336]
vrd0=ingenic_load(indata,0);
[0337]
vrd2=ingenic_load(indata,16);
[0338]
vrd4=ingenic_load(indata,32);
[0339]
vrd6=ingenic_load(indata,48);
[0340]
vrd8=ingenic_load(indata,64);
[0341]
vrd10=ingenic_load(indata,80);
[0342]
vrd12=ingenic_load(indata,96);
[0343]
vrd14=ingenic_load(indata,112);
[0344]
indata=indata+128;
[0345]
b)使用设置好的选择顺序实现对数据由8bit转化为16bit。由于在指令集中没有可以实现将8bit直接转化为16bit的指令,所以需要使用任意取值指令实现该功能。也就是设置两个选择的寄存器vri0,vri1.并对里面的具体选择顺序预先设计好。
[0346]
vrd1=ingenic_choise_h(vrd0,vrd0,vri1);
[0347]
vrd0=ingenic_choise_h(vrd0,vrd0,vri0);
[0348]
vrd3=ingenic_choise_h(vrd2,vrd2,vri1);
[0349]
vrd2=ingenic_choise_h(vrd2,vrd2,vri0);
[0350]
vrd5=ingenic_choise_h(vrd4,vrd4,vri1);
[0351]
vrd4=ingenic_choise_h(vrd4,vrd4,vri0);
[0352]
vrd7=ingenic_choise_h(vrd6,vrd6,vri1);
[0353]
vrd6=ingenic_choise_h(vrd6,vrd6,vri0);
[0354]
vrd9=ingenic_choise_h(vrd8,vrd8,vri1);
[0355]
vrd8=ingenic_choise_h(vrd8,vrd8,vri0);
[0356]
vrd11=ingenic_choise_h(vrd10,vrd10,vri1);
[0357]
vrd10=ingenic_choise_h(vrd10,vrd10,vri0);
[0358]
vrd13=ingenic_choise_h(vrd12,vrd12,vri1);
[0359]
vrd12=ingenic_choise_h(vrd12,vrd12,vri0);
[0360]
vrd15=ingenic_choise_h(vrd14,vrd14,vri1);
[0361]
vrd14=ingenic_choise_h(vrd14,vrd14,vri0);
[0362]
c)进行乘法运算和移位运算。
[0363]
vrd0=ingenic_mul_h(vrd0,mul_0);
[0364]
vrd0=ingenic_shift_right(vrd0,shift_0);
[0365]
vrd1=ingenic_mul_h(vrd1,mul_0);
[0366]
vrd1=ingenic_shift_right(vrd1,shift_0);
[0367]
……
[0368]
vrd15=ingenic_mul_h(vrd15,mul_0);
[0369]
vrd15=ingenic_shift_right(vrd15,shift_0);
[0370]
d)使用设置好的选择顺序实现对数据由16bit转化为8bit。由于在指令集中没有可以实现将16bit直接转化为8bit的指令,所以需要使用任意取值指令实现该功能。也就是设置一个选择的寄存器vri2.并对里面的具体选择顺序预先设计好。
[0371]
vrd0=ingenic_choise_h(vrd0,vrd1,vri2);
[0372]
vrd2=ingenic_choise_h(vrd2,vrd3,vri2);
[0373]
vrd4=ingenic_choise_h(vrd4,vrd5,vri2);
[0374]
vrd6=ingenic_choise_h(vrd6,vrd7,vri3);
[0375]
vrd8=ingenic_choise_h(vrd8,vrd9,vri2);
[0376]
vrd10=ingenic_choise_h(vrd10,vrd11,vri2);
[0377]
vrd12=ingenic_choise_h(vrd12,vrd13,vri2);
[0378]
vrd14=ingenic_choise_h(vrd14,vrd15,vri2);
[0379]
e)对vrd0,vrd2,

,vrd14寄存器里的数据进行保存,保存到savedata里面。然后对savedata指针进行变化,即savedata=savedata+128
[0380]
ingenic_save(vrd0,savedata,0);
[0381]
ingenic_save(vrd2,savedata,16);
[0382]
ingenic_save(vrd4,savedata,32);
[0383]
ingenic_save(vrd6,savedata,48);
[0384]
ingenic_save(vrd8,savedata,64);
[0385]
ingenic_save(vrd10,savedata,80);
[0386]
ingenic_save(vrd12,savedata,96);
[0387]
ingenic_save(vrd14,savedata,112);
[0388]
savedata=savedata+128;
[0389]
f)重复a),b),c),d),e)直到最后一个像素处理完。
[0390]
3)彩色图的优化算法:
[0391]
使用的变量寄存器的声明:vrd0,vrd1,

,vrd7,

,vrd11。被乘数使用的寄存器vmul_0,vmul_1,vmul_2。里面存放mul_r,mul_g,mul_b。移位数使用的寄存器为vshift_0,vshift_1,vshift_2,存放shift_r,shift_g,shift_b。由于彩色三通道的特点,在设计上使用寄存器上,是3的倍数,同时寄存器总数为32个,使用不能超过32个,否存在反复加载和存储数据,造成效率极低。
[0392]
vmul_0=[mul_r,mul_g,mul_b,mul_r,mul_g,mul_b,mul_r,mul_g];
[0393]
vmul_1=[mul_b,mul_r,mul_g,mul_b,mul_r,mul_g,mul_b,mul_r];
[0394]
vmul_2=[mul_g,mul_b,mul_r,mul_g,mul_b,mul_r,mul_g,mul_b];
[0395]
vshift_0=[shift_r,shift_g,shift_b,shift_r,shift_g,shift_b,shift_r,shift_g];
[0396]
vshift_1=[shift_b,shift_r,shift_g,shift_b,shift_r,shift_g,shift_b,shift_r];
[0397]
vshift_2=[shift_g,shift_b,shift_r,shift_g,shift_b,shift_r,shift_g,shift_b];
[0398]
a)加载加载64*3个图像数据到vrd0,vrd1,

,vrd7,

,vrd11。然后在对indata指
针进行变化,即indata=indata+64*3;
[0399]
vrd0=ingenic_load(indata,0);
[0400]
vrd1=ingenic_load(indata,16);
[0401]
vrd2=ingenic_load(indata,32);
[0402]
vrd3=ingenic_load(indata,48);
[0403]
vrd4=ingenic_load(indata,64);
[0404]
vrd5=ingenic_load(indata,80);
[0405]
vrd6=ingenic_load(indata,96);
[0406]
vrd7=ingenic_load(indata,112);
[0407]
vrd8=ingenic_load(indata,128);
[0408]
vrd9=ingenic_load(indata,144);
[0409]
vrd10=ingenic_load(indata,160);
[0410]
vrd11=ingenic_load(indata,176);
[0411]
indata=indata+64*3;
[0412]
b)使用设置好的选择顺序实现对数据由8bit转化为16bit。由于在指令集中没有可以实现将8bit直接转化为16bit的指令,所以需要使用任意取值指令实现该功能。设两个选择的寄存器vri0,vri1.并对里面的具体选择顺序预先设计好。转化16bit的寄存器为vrd_r1、vrd_r0、vrd_g1、vrd_g0、vrd_b1、vrd_b0。然后再进行乘法指令运算和移位指令运算
[0413]
。将乘法运算结果和移位运算结果再保存到vrd_r1、vrd_r0、vrd_g1、vrd_g0、vrd_b1、vrd_b0中。再对vrd1,vrd1,vrd1,vrd2,vrd2,vrd2,vrd3,vrd3,vrd3进行转化为16bit,再进行乘法指令运算和移位指令运算。
[0414]
处理vrdr0、vrdg0、vrdb0
[0415]
《1》8bit转化为16bit处理
[0416]
vrd_r1=ingenic_choise_h(vrd0,vrd0,vri1);
[0417]
vrd_r0=ingenic_choise_h(vrd0,vrd0,vri0);
[0418]
vrd_g1=ingenic_choise_h(vrd1,vrd1,vri1);
[0419]
vrd_g0=ingenic_choise_h(vrd1,vrd1,vri0);
[0420]
vrd_b1=ingenic_choise_h(vrd2,vrd2,vri1);
[0421]
vrd_b0=ingenic_choise_h(vrd2,vrd2,vri0);
[0422]
《2》乘法指令运算和移位指令运算
[0423]
vrd_r0=ingenic_mul_h(vrd_r0,vmul_0);
[0424]
vrd_r0=ingenic_shift_right(vrd_r0,vshift_0);
[0425]
vrd_r1=ingenic_mul_h(vrd_r0,vmul_1);
[0426]
vrd_r1=ingenic_shift_right(vrd_r1,vshift_1);
[0427]
vrd_g0=ingenic_mul_h(vrd_g0,vmul_2);
[0428]
vrd_g0=ingenic_shift_right(vrd_g0,vshift_2);
[0429]
vrd_g1=ingenic_mul_h(vrd_g1,vmul_0);
[0430]
vrd_g1=ingenic_shift_right(vrd_g1,vshift_0);
[0431]
vrd_b0=ingenic_mul_h(vrd_b0,vmul_1);
[0432]
vrd_b0=ingenic_shift_right(vrd_b0,vshift_1);
[0433]
vrd_b1=ingenic_mul_h(vrd_b1,vmul_2);
[0434]
vrd_b1=ingenic_shift_right(vrd_b1,vshift_2);
[0435]
《3》16bit转化为8bit处理
[0436]
vrd0=ingenic_choise_h(vrd_r0,vrd_r1,vri2);
[0437]
vrd1=ingenic_choise_h(vrd_g0,vrd_g1,vri2);
[0438]
vrd2=ingenic_choise_h(vrd_b0,vrd_b1,vri2);
[0439]
按照处理vrd0、vrd1、vrd2的方法处理vrd3、vrd4、vrd5;vrd6、vrd7、vrd8;vrd9、vrd10、vrd11。
[0440]
处理vrd9、vrd10、vrd11如下:
[0441]
《1》8bit转化为16bit处理
[0442]
vrd_r1=ingenic_choise_h(vrd9,vrd9,vri1);
[0443]
vrd_r0=ingenic_choise_h(vrd9,vrd9,vri0);
[0444]
vrd_g1=ingenic_choise_h(vrd10,vrd10,vri1);
[0445]
vrd_g0=ingenic_choise_h(vrd10,vrd10,vri0);
[0446]
vrd_b1=ingenic_choise_h(vrd11,vrd11,vri1);
[0447]
vrd_b0=ingenic_choise_h(vrd11,vrd11,vri0);
[0448]
《2》乘法指令运算和移位指令运算
[0449]
vrd_r0=ingenic_mul_h(vrd_r0,vmul_0);
[0450]
vrd_r0=ingenic_shift_right(vrd_r0,vshift_0);
[0451]
vrd_r1=ingenic_mul_h(vrd_r0,vmul_1);
[0452]
vrd_r1=ingenic_shift_right(vrd_r1,vshift_1);
[0453]
vrd_g0=ingenic_mul_h(vrd_g0,vmul_2);
[0454]
vrd_g0=ingenic_shift_right(vrd_g0,vshift_2);
[0455]
vrd_g1=ingenic_mul_h(vrd_g1,vmul_0);
[0456]
vrd_g1=ingenic_shift_right(vrd_g1,vshift_0);
[0457]
vrd_b0=ingenic_mul_h(vrd_b0,vmul_1);
[0458]
vrd_b0=ingenic_shift_right(vrd_b0,vshift_1);
[0459]
vrd_b1=ingenic_mul_h(vrd_b1,vmul_2);
[0460]
vrd_b1=ingenic_shift_right(vrd_b1,vshift_2);
[0461]
《3》16bit转化为8bit处理
[0462]
vrd9=ingenic_choise_h(vrd_r0,vrd_r1,vri2);
[0463]
vrd10=ingenic_choise_h(vrd_g0,vrd_g1,vri2);
[0464]
vrd11=ingenic_choise_h(vrd_b0,vrd_b1,vri2);
[0465]
c)对vrd0,vrd1,

,vrd11寄存器里的数据进行保存,保存到savedata里面。然后对savedata指针进行变化,即savedata=savedata+64*3;
[0466]
ingenic_save(vrd0,savedata,0);
[0467]
ingenic_save(vrd1,savedata,16);
[0468]
ingenic_save(vrd2,savedata,32);
[0469]
ingenic_save(vrd3,savedata,48);
[0470]
ingenic_save(vrd4,savedata,64);
[0471]
ingenic_save(vrd5,savedata,80);
[0472]
ingenic_save(vrd6,savedata,96);
[0473]
ingenic_save(vrd7,savedata,112);
[0474]
ingenic_save(vrd8,savedata,128);
[0475]
ingenic_save(vrd9,savedata,144);
[0476]
ingenic_save(vrd10,savedata,160);
[0477]
ingenic_save(vrd11,savedata,176);
[0478]
savedata=savedata+64*3;
[0479]
e)重复a)、b)、c)直到最后一个像素处理完。
[0480]
灰度图和彩色图使用了一样的计算乘数mul和移位数shift的方法,这也是最核心最重要的方法,都是根据已经计算出的均值和要求提出的均值,计算乘数mul和移位数shift,灰度图计算出一组乘数mul和移位数shift,彩色图计算出三组乘数mul和移位数shift。
[0481]
在使用乘数mul和移位数shift中,灰度图均值均衡像素处理方法相对简洁,图像数据只有一个通道的数据,使用一个均值,输入数据可以连续处理,处理方法相对容易。彩色图均值均衡像素处理方法处理复杂,彩色图数据是rgbrgbrgb
……
,三个通道的数据交替顺序,使用三个均值,加载数据要根据数据存储,加载均值数据,同时必须是3的倍数个寄存器的使用并且合理使用寄存器的个数,否则需要增加指令,将数据重新排列,增加时间。
[0482]
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1