I'm trying to optimize this code, and in particular I'm trying to optimize how the sequence of gaussian blurs are computed.
I've rewritten the code in this way (notice that most of the parameters and convention have been defined by the original code author):
cv::Mat octaveLayer = //input image
int numberOfScales = 3; //user parameter
int levels = //user parameter
int scaleCycles = numberOfScales+2;
float sigmaStep = pow(2.0f, 1.0f / (float) numberOfScales);
std::vector<float> sigmas;
for(int i=2; i<numberOfScales+2; i++){
sigmas.push_back(sigmas[i-1]*sigmaStep);
}
vector<Mat> blurs (scaleCycles*levels+1, Mat());
for(int i=0; i<levels; i++){
blurs[i*scaleCycles+1] = octaveLayer.clone();
for (int j = 1; j < scaleCycles; j++){
float sigma = par.sigmas[j]* sqrt(sigmaStep * sigmaStep - 1.0f);
blurs[j+1+i*scaleCycles] = gaussianBlur(blurs[j+i*scaleCycles], sigma);
if(j == par.numberOfScales){
octaveLayer = halfImage(blurs[j+1+i*scaleCycles]);
}
}
}
Where:
Mat gaussianBlur(const Mat input, const float sigma)
{
Mat ret(input.rows, input.cols, input.type());
int size = (int)(2.0 * 3.0 * sigma + 1.0); if (size % 2 == 0) size++;
GaussianBlur(input, ret, Size(size, size), sigma, sigma, BORDER_REPLICATE);
return ret;
}
Mat halfImage(const Mat &input)
{
auto start = startTimerHesaff();
Mat n(input.rows/2, input.cols/2, input.type());
float *out = n.ptr<float>(0);
for (int r = 0, ri = 0; r < n.rows; r++, ri += 2)
for (int c = 0, ci = 0; c < n.cols; c++, ci += 2)
*out++ = input.at<float>(ri,ci);
return n;
}
Images ar in 0-255 range values, and this is the code used to read them:
Mat tmp = imread(argv[1]);
Mat image(tmp.rows, tmp.cols, CV_32FC1, Scalar(0));
float *out = image.ptr<float>(0);
unsigned char *in = tmp.ptr<unsigned char>(0);
for (size_t i=tmp.rows*tmp.cols; i > 0; i--)
{
*out = (float(in[0]) + in[1] + in[2])/3.0f;
out++;
in+=3;
}
I think these are all the information that you need to understand the code above, please let me know otherwise.
The code above, which is correct, generates 1760 keypoints.
I actually don't know many details of the code above, for example how different sigma
are computed or sigmaSte
value etc, I'm using the original code for that.
Now, what I want to do is compute each blur independently, so it can be parallelized. According to Wikipeida, this can be done with:
Applying multiple, successive gaussian blurs to an image has the same effect as applying a single, larger gaussian blur, whose radius is the square root of the sum of the squares of the blur radii that were actually applied. For example, applying successive gaussian blurs with radii of 6 and 8 gives the same results as applying a single gaussian blur of radius 10, since {\displaystyle {\sqrt {6^{2}+8^{2}}}=10} {\sqrt {6^{2}+8^{2}}}=10. Because of this relationship, processing time cannot be saved by simulating a gaussian blur with successive, smaller blurs — the time required will be at least as great as performing the single large blur.
Now, to compute the sigmas necessary for each independent computation (using the approach quoted above), I use the following singleSigmas
:
vector<float> singleSigmas(scaleCycles);
float acc = 0;
for (int j = 1; j < scaleCycles; j++){
float sigma = par.sigmas[j]* sqrt(sigmaStep * sigmaStep - 1.0f);
acc += pow(sigma, 2);
singleSigmas[j] = sqrt(acc);
}
And finally I compute the single blurs with:
octaveLayer = //input image;
vector<Mat> singleBlurs (scaleCycles*levels+1, Mat());
for(int i=0; i<levels; i++){
blurs[i*scaleCycles+1] = octaveLayer.clone();
for (int j = 1; j < scaleCycles; j++){
float sigma = singleSigmas[j];
blurs[j+1+i*scaleCycles] = gaussianBlur(blurs[j+i*scaleCycles], sigma);
if(j == par.numberOfScales)
octaveLayer = halfImage(blurs[j+1+i*scaleCycles]);
}
}
However, the code above generates 2398 keypoints. This has 2 consequences:
- It makes the code slower
- Wrong results are given in the application where this detector/descriptor is used.
Now, I tried to understand how big is difference between blurred images created from these 2 approaches with this code:
assert(blurs.size() == singleBlurs.size());
vector<Mat> blurDiffs(blurs.size());
for(int i=1; i<levels*scaleCycles; i++){
cv::Mat diff;
absdiff(blurs[i], singleBlurs[i], diff);
blurDiffs[i] = diff/255;
imwrite( "blueDiffs_"+std::to_string(i)+".jpg", blurDiffs[i]);
}
Notice that blurDiffs[i]
is divided by 255
to show the real difference.
Now, as I will show now, the error gets bigger and bigger. I will past the 30-th row of the 3-th, 10-th, 20-th and 29-th blurred images.
Am I doing something wrong? How can I solve this? Parallelizing this is crucial for my project and I can't go on without this
i=3 blurs.row(30)=
[2.6321561, 2.6072524, 2.5739508, 2.5379355, 2.5013702, 2.4572246, 2.3923287, 2.2992928, 2.1868443, 2.0767827, 1.9881209, 1.922527, 1.8642424, 1.793507, 1.7011285, 1.5939158, 1.4909676, 1.4165379, 1.3922015, 1.4276632, 1.5133274, 1.6225293, 1.7259842, 1.8083814, 1.8729432, 1.9312513, 1.9902229, 2.0491474, 2.1065488, 2.1650562, 2.2261722, 2.2812684, 2.3122294, 2.3050077, 2.2637064, 2.2109749, 2.1743388, 2.1704724, 2.1979811, 2.2402678, 2.2748153, 2.2842259, 2.2631125, 2.2159984, 2.1486614, 2.0624137, 1.9575902, 1.8417341, 1.7330974, 1.6563812, 1.6356608, 1.6887959, 1.8212639, 2.0170629, 2.2329259, 2.4073293, 2.4864445, 2.4523253, 2.3329203, 2.1864722, 2.0723629, 2.0283039, 2.064451, 2.1698334, 2.3204186, 2.4843154, 2.6272759, 2.7212198, 2.7527177, 2.7261343, 2.6599739, 2.5794528, 2.5087473, 2.4641743, 2.4489303, 2.4516103, 2.4509737, 2.4259379, 2.3654218, 2.2726269, 2.1627715, 2.0568209, 1.9733069, 1.9197022, 1.8873187, 1.8551728, 1.8029398, 1.7247921, 1.6341203, 1.5564451, 1.516415, 1.5270182, 1.5855318, 1.6763377, 1.778065, 1.8713049, 1.9436381, 1.9911166, 2.0174835, 2.0320301, 2.0457964, 2.0668795, 2.0976167, 2.1354213, 2.1759241, 2.2162421, 2.2578495, 2.308255, 2.3784404, 2.474653, 2.5895, 2.7006578, 2.7806196, 2.8121901, 2.799588, 2.7668934, 2.7434859, 2.7461176, 2.7713277, 2.8039935, 2.8335595, 2.86303, 2.9037385, 2.9626119, 3.033952, 3.1009512, 3.1429441, 3.1426451, 3.0915725, 2.9936087, 2.8647556, 2.7273781, 2.6016345, 2.4997489, 2.4258962, 2.3793085, 2.3568194, 2.3536298, 2.3631248, 2.376415, 2.3821611, 2.368206, 2.3264265, 2.2594676, 2.1846237, 2.1298492, 2.1214461, 2.1698115, 2.2631018, 2.3741281, 2.4753072, 2.549741, 2.5911417, 2.5968778, 2.5643766, 2.4954481, 2.4025781, 2.3072939, 2.2282345, 2.1684582, 2.1147535, 2.0514407, 1.9772474, 1.9103736, 1.8769712, 1.892217, 1.9488287, 2.0211916, 2.0808644, 2.1117864, 2.1158926, 2.1079109, 2.1046286, 2.1152771, 2.1373208, 2.158725, 2.1651616, 2.1484885, 2.1116977, 2.0670102, 2.0283368, 2.0035174, 1.9913187, 1.9834974, 1.9688644, 1.9376596, 1.8871003, 1.8273448, 1.7824289, 1.780877, 1.8392742, 1.9508772, 2.0890203, 2.2229359, 2.334578, 2.4264669, 2.5176904, 2.631285, 2.7801101, 2.9595232, 3.151279, 3.335582, 3.5032067, 3.6602793, 3.8230917, 4.0065598, 4.2144704, 4.4382515, 4.6633296, 4.8759198, 5.0650454, 5.2215466, 5.3383603, 5.4121351, 5.4430251, 5.4329243, 5.3866472, 5.3172183, 5.2486229, 5.208735, 5.2150168, 5.2652965, 5.3430104, 5.4328041, 5.5321417, 5.6479659, 5.7811313, 5.9128466, 6.006671, 6.0271015, 5.9622245, 5.8352404, 5.6981106, 5.6107426, 5.6149483, 5.7156463, 5.8808417, 6.0616851, 6.2188392, 6.3366647, 6.4189343, 6.4758844, 6.5159068, 6.5453472, 6.5700846, 6.5934834, 6.6129298, 6.6207952, 6.6109858, 6.5857701, 6.557024, 6.5411301, 6.5513854, 6.5921292, 6.6566935, 6.7298999, 6.7950544, 6.8434134, 6.8809891, 6.9266739, 7.0000973, 7.1059718, 7.2267222, 7.3301778, 7.3871241, 7.3861852, 7.3375478, 7.26577, 7.1965775, 7.1434374, 7.1007729, 7.0492396, 6.9705076, 6.8601818, 6.7281103, 6.5867615, 6.4399128, 6.2841206, 6.1227217, 5.9782686, 5.889039, 5.8895864, 5.989182, 6.1628294, 6.3598146, 6.524281, 6.6168213, 6.6263094, 6.567471, 6.4688072, 6.3599987, 6.2641516, 6.1937628, 6.1480494, 6.1131673, 6.0687408, 6.0003977, 5.911417, 5.8239985, 5.7665601, 5.7550073, 5.7823548, 5.8246536, 5.8573794, 5.8692775, 5.865428, 5.8602953, 5.866713, 5.8878961, 5.9174061, 5.9457731, 5.9665956, 5.9769449, 5.9747849, 5.9592762, 5.934258, 5.9093161, 5.8949099, 5.8951521, 5.9050589, 5.9145989, 5.9150839, 5.9018707, 5.8722463, 5.8235431, 5.7566066, 5.6824732, 5.6231108, 5.6004591, 5.6203356, 5.6651917, 5.7029014, 5.7042112, 5.6549945, 5.5571194, 5.4234638, 5.2746987, 5.1379428, 5.0427108, 5.0133448, 5.0618925, 5.1844258, 5.3609214, 5.5590434, 5.7428875, 5.8847356, 5.9737897, 6.0163445, 6.027452, 6.0200124, 5.9988604, 5.9636812, 5.9172649, 5.8704476, 5.8377752, 5.8269677, 5.8316851, 5.8345833, 5.8194556, 5.7844353, 5.7465763, 5.7329621, 5.7635489, 5.8391128, 5.9439254, 6.0584941, 6.168366, 6.2619896, 6.3252516, 6.3440161, 6.3147993, 6.2521873, 6.1834879, 6.1335196, 6.111413, 6.108417, 6.106082, 6.0877976, 6.0472674, 5.9907551, 5.9325385, 5.8856812, 5.853518, 5.8279729, 5.7961593, 5.7499418, 5.6912684, 5.6307502, 5.5822463, 5.5566316, 5.5562005, 5.5721893, 5.589097, 5.5946064, 5.5866556, 5.5709357, 5.5531039, 5.535964, 5.5238686, 5.525671, 5.548903, 5.5896482, 5.6298475, 5.6475697, 5.6326289, 5.5937362, 5.5512047, 5.5227528, 5.5146723, 5.5228505, 5.5387559, 5.5540719, 5.5624132, 5.5596452, 5.5438237, 5.5145273, 5.4714112, 5.4123764, 5.3318243, 5.2202001, 5.0672092, 4.8694782, 4.6382098, 4.3992853, 4.1831546, 4.0113001, 3.8897789, 3.8142219, 3.7813332, 3.797307, 3.8756618, 4.0243134, 4.2310362, 4.4602084, 4.6657267, 4.8115611, 4.8862157, 4.9037981, 4.893527, 4.8846455, 4.8944659, 4.9240232, 4.9601183, 4.9798093, 4.9559946, 4.8656731, 4.7002897, 4.4725971, 4.2135549, 3.9585876, 3.7306511, 3.5310068, 3.344084, 3.1526978, 2.9519546, 2.7518046, 2.5681694, 2.4114296, 2.2813184, 2.170481, 2.0718834, 1.9832914, 1.9060037, 1.8408363, 1.7861458, 1.7392266, 1.6985724, 1.6646732, 1.6397436, 1.6277064, 1.6338872, 1.662333, 1.7103993, 1.7642674, 1.8009442, 1.7984173, 1.7483726, 1.6623619, 1.5667071, 1.4899224, 1.4513329, 1.4567674, 1.5002097, 1.5668643, 1.6363086, 1.6883787, 1.7119681, 1.7104565, 1.6971872, 1.6837168, 1.6720531, 1.6581283, 1.6411591, 1.6276146, 1.6256427, 1.6363623, 1.6510078, 1.6568155, 1.6468003, 1.6255035, 1.6062443, 1.6023341, 1.6190569, 1.6514273, 1.6877728, 1.716188, 1.7308466, 1.7354219, 1.7411293, 1.7594072, 1.7934984, 1.8350426, 1.8688196, 1.8831234, 1.8787839, 1.8697219, 1.8733909, 1.8975881, 1.9337764, 1.9618661, 1.9623187, 1.9272389, 1.8647472, 1.7954437, 1.7431151, 1.7246455, 1.7450585, 1.7998279, 1.8804504, 1.9776224, 2.0812154, 2.1807528, 2.2680809, 2.3389595, 2.3907285, 2.4190505, 2.4191196, 2.3914728, 2.3464851, 2.3023882, 2.2773163, 2.2802024, 2.3061218, 2.3395388, 2.3641641, 2.3728757, 2.3703871, 2.3669279, 2.3683388, 2.3703897, 2.3611565, 2.3287487, 2.268028, 2.1822524, 2.080759, 1.9757687, 1.8792555, 1.7994998, 1.7388904, 1.6953306, 1.666087, 1.649754, 1.6444727, 1.6454675, 1.6454085, 1.6371074, 1.6159599, 1.5813355, 1.5374241, 1.4926341, 1.4562371, 1.4337746, 1.4249188, 1.4253048, 1.4301893, 1.4371425, 1.4467663, 1.4614369, 1.4824256, 1.5071266, 1.5289332, 1.5401373, 1.5352708, 1.5127033, 1.4751301, 1.4301527, 1.3897605, 1.3667523, 1.3694086, 1.3988551, 1.4514316, 1.5226552, 1.6073904, 1.6962057, 1.7743504, 1.8281941, 1.8548849, 1.8653431, 1.8760796, 1.8961002, 1.9197433, 1.9307847, 1.913922, 1.8648318, 1.7919683, 1.7098852, 1.6304719, 1.5594769, 1.4994663, 1.4537667, 1.4265541, 1.4199668, 1.4316647, 1.454493, 1.4789298, 1.4987838, 1.5172997, 1.5471306, 1.6009163, 1.6783155, 1.7603649, 1.8168899, 1.8222667, 1.7687452, 1.6695029, 1.551847, 1.44673, 1.3799897, 1.3665261, 1.4063176, 1.4823966, 1.5631011, 1.6111246, 1.5987287, 1.5228447, 1.4098272, 1.3030503, 1.2381505, 1.2220109, 1.2312304, 1.2315236, 1.2028142, 1.1510376, 1.1002256, 1.0745686, 1.0849457, 1.1266211, 1.1852914, 1.2457182, 1.2990487, 1.3463299, 1.396134, 1.4566878, 1.5275487, 1.5976688, 1.6520851, 1.6819899, 1.6901957, 1.6887796, 1.6924598, 1.7129451, 1.7557837, 1.8184245, 1.8898191, 1.9537883, 1.9957954, 2.0088243, 1.9949033, 1.9631048, 1.9263246, 1.8973945, 1.8850787, 1.8921025, 1.9162042, 1.9517238, 1.9900744, 2.0217144]
i=3 singleBlurs.row(30)=
[2.6263187, 2.600189, 2.5669997, 2.5292282, 2.4868627, 2.4356327, 2.3695517, 2.2866132, 2.1927383, 2.0995128, 2.0167091, 1.945513, 1.8781538, 1.8041672, 1.7183861, 1.625427, 1.5388812, 1.4764911, 1.4533776, 1.4755006, 1.5363339, 1.619475, 1.7065872, 1.7856952, 1.8541733, 1.9153633, 1.973159, 2.0294681, 2.0850012, 2.1398752, 2.1917264, 2.2336659, 2.2562721, 2.254039, 2.2313633, 2.202455, 2.1844709, 2.1884797, 2.2139449, 2.2494559, 2.2786222, 2.2874999, 2.269361, 2.2245502, 2.1569164, 2.0708678, 1.9718584, 1.8691863, 1.7776924, 1.7162443, 1.7034975, 1.752256, 1.8632303, 2.019834, 2.187958, 2.3246269, 2.3943181, 2.3848855, 2.313237, 2.217093, 2.1383431, 2.1078873, 2.1384742, 2.2252822, 2.3502841, 2.4876094, 2.6096585, 2.6939218, 2.7287738, 2.7157791, 2.66765, 2.6031356, 2.5408983, 2.4939065, 2.4655464, 2.4488864, 2.4300225, 2.3945603, 2.3342657, 2.2506802, 2.1542952, 2.0599995, 1.9806738, 1.9214031, 1.8771216, 1.8356513, 1.7852066, 1.7221609, 1.6542544, 1.5973607, 1.568061, 1.5763452, 1.6218718, 1.6947794, 1.7798696, 1.8619503, 1.9302257, 1.980495, 2.0149019, 2.0396917, 2.0619581, 2.0867789, 2.1160047, 2.1490278, 2.184763, 2.2237256, 2.2693257, 2.3274696, 2.4036789, 2.4983406, 2.6029432, 2.7008698, 2.7738419, 2.8109667, 2.8147843, 2.799998, 2.7852364, 2.7831981, 2.7959151, 2.8179314, 2.8438461, 2.873462, 2.9106035, 2.957509, 3.0099857, 3.0569253, 3.0839646, 3.0787849, 3.0356376, 2.9575322, 2.8553016, 2.7438653, 2.6375096, 2.5465202, 2.4762728, 2.4280462, 2.4001276, 2.3884161, 2.3865974, 2.3863838, 2.3784535, 2.3547282, 2.3119817, 2.255338, 2.1990147, 2.1623011, 2.1615429, 2.2022281, 2.2760875, 2.36516, 2.4498007, 2.5150895, 2.5523438, 2.5572937, 2.5289547, 2.4710171, 2.3933079, 2.3096139, 2.2315483, 2.1629152, 2.0998597, 2.0374663, 1.9775201, 1.9306321, 1.9104246, 1.9240181, 1.966036, 2.0204735, 2.068927, 2.0995123, 2.1111078, 2.111253, 2.1099668, 2.1135013, 2.1212604, 2.1269863, 2.1230814, 2.1054618, 2.0761275, 2.0420067, 2.0109627, 1.9875844, 1.9711624, 1.9564948, 1.9366733, 1.9068514, 1.8681744, 1.8302989, 1.810027, 1.8248589, 1.8840851, 1.9831166, 2.1054564, 2.2315147, 2.3487606, 2.4571393, 2.5670173, 2.6914587, 2.8376462, 3.0024979, 3.1748435, 3.342505, 3.4997234, 3.6503432, 3.8050194, 3.9745035, 4.1634431, 4.3681917, 4.5788212, 4.7827754, 4.9677324, 5.12323, 5.2417526, 5.3193693, 5.3557701, 5.35428, 5.3229389, 5.2759628, 5.2327647, 5.2125969, 5.2270331, 5.2758951, 5.3503332, 5.4407058, 5.5423975, 5.6542282, 5.7709188, 5.8768711, 5.9482379, 5.9638948, 5.9188337, 5.8312874, 5.7384896, 5.6824207, 5.6923566, 5.7731295, 5.9054089, 6.0573835, 6.2001657, 6.3176365, 6.4068613, 6.4724402, 6.5207977, 6.5574512, 6.5861654, 6.6081719, 6.621706, 6.6234288, 6.6118813, 6.590765, 6.5694151, 6.5597353, 6.5712514, 6.6068807, 6.6615, 6.7242031, 6.7836924, 6.8344893, 6.8803654, 6.932117, 6.9999623, 7.0849853, 7.1755252, 7.2515531, 7.2945004, 7.2964497, 7.2633061, 7.2105923, 7.1545548, 7.103519, 7.0543242, 6.9958568, 6.9171295, 6.8140292, 6.6900511, 6.551723, 6.4042954, 6.2528262, 6.1079979, 5.9902568, 5.9260535, 5.936276, 6.0237074, 6.167768, 6.3302474, 6.4691324, 6.5533609, 6.5715752, 6.531918, 6.4549279, 6.3642721, 6.2791352, 6.2096653, 6.1554718, 6.1075525, 6.0539498, 5.9875579, 5.9119811, 5.8411012, 5.7916169, 5.7730942, 5.782352, 5.8059454, 5.8284993, 5.8409367, 5.8436222, 5.8435564, 5.8484521, 5.8617945, 5.8815703, 5.9023767, 5.9184299, 5.9254775, 5.9216495, 5.9082222, 5.8900404, 5.8742466, 5.8669634, 5.8698039, 5.8788095, 5.8864889, 5.8851428, 5.8690825, 5.8353071, 5.7841864, 5.721303, 5.6587582, 5.6126032, 5.5953798, 5.6077609, 5.6356368, 5.6556029, 5.645463, 5.5930886, 5.4995255, 5.3771996, 5.2462564, 5.1307259, 5.0541964, 5.0348291, 5.0807428, 5.1873403, 5.3377066, 5.5065346, 5.666975, 5.798171, 5.8901577, 5.9438291, 5.966548, 5.9666429, 5.9503598, 5.9225264, 5.8890204, 5.8576231, 5.8354635, 5.8247194, 5.8204098, 5.8130765, 5.7954912, 5.769156, 5.7457504, 5.7417831, 5.7696815, 5.8314924, 5.9191031, 6.0192699, 6.1182575, 6.2031713, 6.2620015, 6.2860103, 6.2743974, 6.236917, 6.1905174, 6.1510739, 6.1256542, 6.1103907, 6.0947461, 6.0688114, 6.0291257, 5.9800854, 5.9306555, 5.8885455, 5.8554311, 5.8262949, 5.7932596, 5.7512045, 5.7014823, 5.6516557, 5.6117764, 5.5893059, 5.5851517, 5.5930362, 5.6029115, 5.6064415, 5.6007237, 5.5879617, 5.5726333, 5.5595179, 5.553566, 5.5593457, 5.5782018, 5.605011, 5.6285977, 5.6373405, 5.6263142, 5.6003723, 5.5707431, 5.5481496, 5.5376415, 5.5378537, 5.5435495, 5.5486994, 5.5483952, 5.5394721, 5.5202575, 5.4897308, 5.4462314, 5.3861127, 5.3031344, 5.1896329, 5.04005, 4.8557281, 4.6479239, 4.4361053, 4.2416282, 4.0806189, 3.9608572, 3.8843727, 3.8530161, 3.8719182, 3.947247, 4.0790939, 4.2546015, 4.4472823, 4.6244841, 4.7592282, 4.8397279, 4.8717265, 4.8732977, 4.8654876, 4.8633876, 4.8708849, 4.8799472, 4.8736372, 4.8317451, 4.7380347, 4.5871682, 4.3881993, 4.1619163, 3.9324222, 3.717159, 3.5211763, 3.3388958, 3.1615875, 2.9849472, 2.8117354, 2.6487, 2.5013006, 2.3706241, 2.2542264, 2.1491482, 2.0541189, 1.9694602, 1.8956245, 1.8321853, 1.7780873, 1.7325687, 1.6958921, 1.6696349, 1.6565477, 1.6595745, 1.6795487, 1.7121732, 1.7464643, 1.7670121, 1.7601948, 1.7212441, 1.6576664, 1.5866063, 1.5277349, 1.4958514, 1.4966441, 1.5262916, 1.5736709, 1.6241181, 1.664301, 1.686928, 1.6926874, 1.6877331, 1.6785194, 1.6683053, 1.6578898, 1.6486636, 1.6438298, 1.6460522, 1.6539818, 1.6615676, 1.6615528, 1.6507142, 1.6327779, 1.6167152, 1.6116254, 1.6217244, 1.6444944, 1.6726935, 1.6986855, 1.7186056, 1.734136, 1.7508101, 1.7736788, 1.803043, 1.8333344, 1.8563473, 1.8669311, 1.8671405, 1.8655075, 1.8714182, 1.8882973, 1.9104285, 1.9257079, 1.9225383, 1.8965876, 1.853672, 1.8075389, 1.7740859, 1.7653028, 1.78602, 1.8343883, 1.9044555, 1.9885098, 2.078342, 2.1661122, 2.2452576, 2.3108282, 2.3588767, 2.3859854, 2.3904123, 2.3745608, 2.3464475, 2.3180122, 2.3004689, 2.2992909, 2.3119886, 2.330236, 2.3451402, 2.3522124, 2.3526998, 2.3505497, 2.3475692, 2.3405561, 2.3224349, 2.2862432, 2.2290075, 2.1532662, 2.0660789, 1.9766177, 1.8934402, 1.822279, 1.7651964, 1.7214962, 1.689505, 1.6676142, 1.653873, 1.6450564, 1.6365595, 1.6234823, 1.6022855, 1.5722468, 1.5361166, 1.4994327, 1.4684253, 1.4474685, 1.4376024, 1.4369333, 1.4423958, 1.4516135, 1.4638005, 1.4792621, 1.4978621, 1.5175443, 1.5341103, 1.5424995, 1.5387232, 1.5214621, 1.4929991, 1.4594249, 1.429688, 1.4131804, 1.4167082, 1.4426486, 1.4892396, 1.5519733, 1.6243484, 1.697862, 1.7630227, 1.8125321, 1.8449054, 1.8650709, 1.8804473, 1.8949789, 1.9056762, 1.9043206, 1.8829737, 1.8391808, 1.7773497, 1.7059724, 1.6334801, 1.5659604, 1.5075988, 1.4620944, 1.4329438, 1.4221762, 1.4287659, 1.4483131, 1.4748869, 1.5044765, 1.5377455, 1.5792663, 1.6326108, 1.6943582, 1.7518357, 1.7870744, 1.784974, 1.7407978, 1.6629713, 1.5703871, 1.486204, 1.4308233, 1.4159251, 1.4406163, 1.4906983, 1.542141, 1.5689991, 1.5537894, 1.495778, 1.4119855, 1.3288075, 1.2680626, 1.2358686, 1.2216717, 1.2078638, 1.182838, 1.1483183, 1.1168674, 1.1028873, 1.1140839, 1.1483915, 1.1967813, 1.2491106, 1.2994224, 1.3480084, 1.3993064, 1.457027, 1.5198224, 1.5807137, 1.6308399, 1.6648332, 1.6840545, 1.6958826, 1.7101647, 1.7351848, 1.7746944, 1.8264928, 1.8828691, 1.9331388, 1.9675554, 1.980836, 1.9737301, 1.9523246, 1.92575]
i=10 blurs.row(30)=
[1.9941474, 1.9739347, 1.9481091, 1.9185654, 1.8883624, 1.8611373, 1.8403392, 1.8284851, 1.8265797, 1.8338917, 1.8480929, 1.8659066, 1.8839773, 1.8997231, 1.9118657, 1.9204774, 1.9265786, 1.9315035, 1.936334, 1.9416229, 1.9474738, 1.9538841, 1.9611564, 1.9701815, 1.9824845, 2.0000148, 2.0247586, 2.0583127, 2.1015439, 2.1544399, 2.2161622, 2.2852516, 2.3598824, 2.4380577, 2.5176976, 2.5966356, 2.6725948, 2.7432179, 2.8061976, 2.8594706, 2.9014089, 2.9309261, 2.9474609, 2.9508736, 2.9413068, 2.9191029, 2.8848131, 2.8392687, 2.7836776, 2.7196784, 2.6493161, 2.5749681, 2.4992378, 2.4248528, 2.3545854, 2.291168, 2.2371964, 2.1950157, 2.1665881, 2.1533988, 2.1564069, 2.1760855, 2.2125387, 2.2656801, 2.3354273, 2.4218628, 2.5253129, 2.6463101, 2.7854326, 2.9430509, 3.119024, 3.312423, 3.5213463, 3.7428911, 3.9733126, 4.2083402, 4.4435587, 4.6747317, 4.8979287, 5.1094456, 5.3056355, 5.4828529, 5.6377082, 5.7676425, 5.8716416, 5.9507575, 6.008121, 6.048389, 6.0767932, 6.0981817, 6.116395, 6.1341343, 6.1532326, 6.1750393, 6.2006435, 6.2308259, 6.2658367, 6.3052287, 6.3479829, 6.3929582, 6.4394903, 6.4878321, 6.539176, 6.5951948, 6.6573324, 6.7261758, 6.8012257, 6.8811688, 6.9644799, 7.0500445, 7.1375275, 7.2273269, 7.3202043, 7.4167724, 7.517097, 7.6205697, 7.7261014, 7.832552, 7.9392166, 8.0461922, 8.1544628, 8.2657299, 8.3820105, 8.5052071, 8.6367188, 8.777215, 8.9265432, 9.0837831, 9.2473974, 9.4154625, 9.5859442, 9.7569141, 9.9266682, 10.093677, 10.256421, 10.413223, 10.562252, 10.701733, 10.830371, 10.947821, 11.054977, 11.153996, 11.247932, 11.340181, 11.433838, 11.531192, 11.633492, 11.740978, 11.853159, 11.969203, 12.088291, 12.209829, 12.333475, 12.458927, 12.585624, 12.712391, 12.837209, 12.957108, 13.068288, 13.16643, 13.247147, 13.306542, 13.341723, 13.351214, 13.335145, 13.295207, 13.234399, 13.156622, 13.066207, 12.967441, 12.864074, 12.758874, 12.65321, 12.546863, 12.438107, 12.324223, 12.202347, 12.070433, 11.928055, 11.776756, 11.619835, 11.461592, 11.306324, 11.157295, 11.016, 10.881869, 10.752463, 10.624059, 10.49247, 10.353875, 10.205499, 10.04597, 9.8753881, 9.6951189, 9.5073872, 9.3147926, 9.1198072, 8.9243374, 8.729454, 8.5353279, 8.341444, 8.1470261, 7.9515514, 7.7551785, 7.5589461, 7.3647089, 7.1748667, 6.9920034, 6.8185472, 6.6565218, 6.507381, 6.3719344, 6.2503328, 6.1421237, 6.0463333, 5.9615593, 5.8860192, 5.817584, 5.7538018, 5.6919985, 5.6294641, 5.5637403, 5.4929419, 5.4160328, 5.3330092, 5.2449288, 5.1537914, 5.0622821, 4.9733996, 4.8900442, 4.8146372, 4.7488632, 4.6935787, 4.6489015, 4.6144109, 4.5893655, 4.5728579, 4.5638409, 4.5610509, 4.5628643, 4.5671806, 4.571413, 4.5726051, 4.5676532, 4.5535398, 4.527492, 4.4870129, 4.4298224, 4.3538356, 4.2572479, 4.1388154, 3.9982498, 3.8366051, 3.6565092, 3.4621434, 3.258955, 3.0531745, 2.8512318, 2.6591668, 2.4820981, 2.3238008, 2.1864486, 2.0705748, 1.9752793, 1.8986322, 1.8381808, 1.791407, 1.7560217, 1.7300594, 1.7118124, 1.6997132, 1.6922646, 1.6880894, 1.6860869, 1.6856418, 1.6867739, 1.6901459, 1.6968724, 1.708169, 1.7249435, 1.7474672, 1.7752423, 1.8071064, 1.8415, 1.8767728, 1.9113852, 1.9439375, 1.9730599, 1.9972727, 2.0149543, 2.0244825, 2.0245245, 2.0143619, 1.9941082, 1.9647249, 1.9278245, 1.8853573, 1.8393002, 1.7914575, 1.7434033, 1.6965216, 1.6520557, 1.6110965, 1.5744835, 1.5426617, 1.5155618, 1.4925758, 1.4726568, 1.4545316, 1.4369746, 1.4190799, 1.4004598, 1.3813269, 1.3624377, 1.344921, 1.3300442, 1.3190035, 1.3127953, 1.3121898, 1.3177719, 1.3299712, 1.3490129, 1.3747756, 1.4066057, 1.4431812, 1.4824964, 1.5219991, 1.5588402, 1.5901862, 1.6135501, 1.6271162, 1.630085, 1.6228554, 1.6071302, 1.5857464, 1.5621929, 1.5398799, 1.5213674]
i=10 singleBlurs.row(30)=
[2.0006344, 1.985557, 1.9683412, 1.9498469, 1.9312016, 1.9136564, 1.8984088, 1.8864402, 1.8783965, 1.8745303, 1.8747181, 1.8785284, 1.885337, 1.8944614, 1.9052421, 1.9171458, 1.9298159, 1.9430871, 1.9569762, 1.971663, 1.9874581, 2.0047719, 2.0240779, 2.0458744, 2.0706334, 2.098748, 2.1304777, 2.1659043, 2.2048979, 2.2471099, 2.2919869, 2.3388076, 2.3867264, 2.4348297, 2.4821804, 2.527863, 2.5710084, 2.6108091, 2.6465256, 2.6774864, 2.7030849, 2.7227788, 2.7360952, 2.7426486, 2.742167, 2.7345304, 2.7198153, 2.698344, 2.6707315, 2.6379116, 2.6011477, 2.5620224, 2.522387, 2.4842992, 2.4499283, 2.4214523, 2.4009452, 2.3902729, 2.3910036, 2.4043443, 2.4311092, 2.4717209, 2.5262475, 2.5944641, 2.6759293, 2.7700653, 2.8762231, 2.9937267, 3.1218843, 3.2599657, 3.4071636, 3.5625257, 3.7248995, 3.8928835, 4.0648031, 4.2387176, 4.4124742, 4.5837665, 4.7502499, 4.9096551, 5.0599289, 5.1993675, 5.3267407, 5.4413934, 5.5433021, 5.6330743, 5.7118959, 5.7814097, 5.8435626, 5.9004359, 5.9540615, 6.0062823, 6.05864, 6.1123223, 6.1681504, 6.2266135, 6.2879376, 6.3521719, 6.4192843, 6.4892497, 6.5621095, 6.6380081, 6.7171903, 6.7999601, 6.8866339, 6.9774871, 7.0727005, 7.1723509, 7.2764125, 7.3847938, 7.4973679, 7.6140203, 7.7346888, 7.8593788, 7.9881945, 8.121335, 8.2591133, 8.4019499, 8.5503731, 8.704999, 8.8665161, 9.0356245, 9.2129946, 9.3992014, 9.5946617, 9.7995806, 10.013918, 10.237357, 10.469324, 10.708996, 10.955343, 11.207178, 11.463207, 11.722107, 11.982594, 12.243489, 12.503818, 12.762853, 13.020167, 13.275664, 13.529545, 13.78228, 14.034504, 14.286928, 14.540226, 14.794927, 15.051348, 15.30953, 15.569206, 15.829795, 16.090382, 16.349707, 16.606169, 16.857792, 17.102234, 17.336786, 17.558434, 17.763958, 17.950047, 18.113485, 18.25136, 18.361242, 18.441345, 18.490683, 18.509069, 18.497137, 18.456215, 18.38818, 18.295248, 18.179768, 18.044006, 17.890015, 17.719519, 17.533905, 17.334242, 17.121412, 16.896194, 16.659393, 16.411921, 16.154823, 15.889236, 15.616316, 15.337132, 15.052558, 14.763195, 14.46935, 14.171077, 13.868258, 13.560749, 13.248494, 12.931679, 12.610781, 12.286616, 11.960311, 11.633215, 11.30681, 10.982584, 10.661947, 10.346151, 10.03629, 9.7332926, 9.4379873, 9.1511593, 8.873601, 8.6061535, 8.3496923, 8.1051121, 7.8732495, 7.6548104, 7.4502878, 7.2598982, 7.0835328, 6.9207377, 6.7707248, 6.6323943, 6.5043969, 6.3851881, 6.2731075, 6.1664653, 6.0636268, 5.9631114, 5.8636813, 5.7644277, 5.6648288, 5.564785, 5.4646149, 5.3650079, 5.2669468, 5.1715908, 5.0801573, 4.9937873, 4.9134436, 4.8398242, 4.7733088, 4.7139397, 4.6614189, 4.6151347, 4.5741863, 4.5374169, 4.5034556, 4.4707541, 4.4376402, 4.4023767, 4.3632159, 4.3184834, 4.2666397, 4.2063513, 4.1365504, 4.0564985, 3.9658222, 3.8645658, 3.7532105, 3.6326921, 3.5043876, 3.3700786, 3.2318752, 3.0921147, 2.9532278, 2.8175936, 2.687396, 2.5644958, 2.4503417, 2.3459208, 2.2517605, 2.1679683, 2.0943105, 2.0302968, 1.975278, 1.9285282, 1.889308, 1.8569125, 1.8306992, 1.8101022, 1.7946393, 1.7839025, 1.7775489, 1.7752801, 1.7768126, 1.781849, 1.7900456, 1.8009858, 1.8141651, 1.8289856, 1.8447632, 1.8607454, 1.8761338, 1.8901136, 1.9018862, 1.9107051, 1.9159125, 1.9169797, 1.9135423, 1.9054295, 1.8926781, 1.8755339, 1.8544337, 1.8299693, 1.8028449, 1.7738224, 1.7436693, 1.713109, 1.6827754, 1.6531808, 1.6246902, 1.5975168, 1.5717269, 1.5472672, 1.524002, 1.5017666, 1.4804227, 1.4599121, 1.4402977, 1.4217898, 1.40475]
i=20 blurs.row(30)=
[9.9490995, 11.234114, 13.385068, 16.783056, 21.876455, 29.136597, 38.978916, 51.658279, 67.163086, 85.142212, 104.89828, 125.45939, 145.7198, 164.6125, 181.26482, 195.09563, 205.834, 213.46835, 218.15703, 220.13998, 219.68478, 217.08286, 212.68936, 206.98079, 200.59479, 194.31987, 189.01845, 185.49376, 184.33444, 185.787, 189.69942, 195.55862, 202.6114, 210.0304, 217.07539, 223.20575, 228.1226, 231.74313, 234.12933, 235.40065, 235.65689, 234.9296, 233.17078, 230.28072, 226.1693, 220.83783, 214.45976, 207.43321, 200.3782, 194.06522, 189.28194, 186.66985, 186.57788, 188.97934, 193.47897, 199.40697, 205.96811, 212.39828, 218.08391, 222.61736, 225.78488, 227.50443, 227.73967, 226.41866, 223.37979, 218.35886, 211.02367, 201.05252, 188.2412, 172.61394, 154.50476, 134.57779, 113.77003, 93.162071, 73.807541, 56.567101, 41.992302, 30.286011, 21.338125, 14.816268, 10.274991, 7.2518845, 5.3314738, 4.1740904]
i=20 singleBlurs.row(30)=
[15.771568, 18.619764, 22.510773, 27.637539, 34.165379, 42.209904, 51.815155, 62.935238, 75.422554, 89.025726, 103.3989, 118.12237, 132.73251, 146.75673, 159.75136, 171.33443, 181.21205, 189.19655, 195.21507, 199.31023, 201.63312, 202.43048, 202.02657, 200.7998, 199.1554, 197.49431, 196.18117, 195.51411, 195.70009, 196.8394, 198.9222, 201.83673, 205.38898, 209.32957, 213.3837, 217.27936, 220.77005, 223.65031, 225.76323, 227.00273, 227.31189, 226.68112, 225.14706, 222.79359, 219.75304, 216.20616, 212.37805, 208.52731, 204.92844, 201.84787, 199.5166, 198.10336, 197.69295, 198.27368, 199.73601, 201.88219, 204.44493, 207.11176, 209.54997, 211.42975, 212.44157, 212.30852, 210.79384, 207.70651, 202.90617, 196.31026, 187.9026, 177.74336, 165.97649, 152.83325, 138.62694, 123.73881, 108.59443, 93.63382, 79.276283, 65.889153, 53.761784, 43.089569, 33.968876, 26.402786, 20.315102, 15.569589, 11.99113, 9.3860664]
i=29 blurs.row(30)=
[21.805313, 22.58708, 23.581913, 24.661949, 25.684336, 26.550188, 27.230352, 27.7549, 28.182364, 28.568476, 28.942799, 29.298336, 29.590931, 29.74526, 29.667345, 29.268572, 28.500404, 27.396454, 26.095198, 24.812632, 23.758797]
i=29 singleBlurs.row(30)=
[23.956791, 24.559422, 25.290764, 26.106785, 26.950768, 27.767517, 28.514786, 29.167725, 29.715893, 30.155384, 30.479221, 30.67272, 30.711205, 30.566673, 30.215635, 29.652941, 28.902712, 28.02227, 27.095169, 26.213591, 25.455793]