22
22
23
23
#define MAX (a , b ) (((a) > (b)) ? (a) : (b))
24
24
#define MIN (a , b ) (((a) < (b)) ? (a) : (b))
25
- #define LIBSMALLFRYVERSION "0.1.3 "
25
+ #define LIBSMALLFRYVERSION "0.2.0 "
26
26
27
+ /* PSNR(a,b) = 10*log10(MAX * MAX / E((a-b)*(a-b)))
28
+ * MAX = 255 */
27
29
static float factor_psnr (uint8_t * orig , uint8_t * cmp , int orig_stride , int cmp_stride , int width , int height , uint8_t max )
28
30
{
29
31
uint8_t * old , * new ;
@@ -58,6 +60,8 @@ static float factor_psnr (uint8_t *orig, uint8_t *cmp, int orig_stride, int cmp_
58
60
return MAX (MIN (ret , 1.0f ), 0.0f );
59
61
}
60
62
63
+ /* AAE(a,b) = K * E(a(GRID) - b(GRID))
64
+ * GRID = {{0,7},8} */
61
65
static float factor_aae (uint8_t * orig , uint8_t * cmp , int orig_stride , int cmp_stride , int width , int height , uint8_t max )
62
66
{
63
67
uint8_t * old , * new ;
@@ -178,6 +182,9 @@ static uint8_t maxluma (uint8_t *buf, int stride, int width, int height)
178
182
return max ;
179
183
}
180
184
185
+ /* SMALLFRY(a,b) = (K1 * PSNR(a,b) + K2 * AAE(a,b))
186
+ * K1 = 37.1891885161239
187
+ * K2 = 78.5328607296973 */
181
188
float metric_smallfry (uint8_t * inbuf , uint8_t * outbuf , int width , int height )
182
189
{
183
190
float p , a , b ;
@@ -193,107 +200,7 @@ float metric_smallfry (uint8_t *inbuf, uint8_t *outbuf, int width, int height)
193
200
return b ;
194
201
}
195
202
196
- float metric_sharpenbad (uint8_t * inbuf , uint8_t * outbuf , int width , int height )
197
- {
198
- uint8_t * old , * new ;
199
- float sharpenbad , exp1n , k332 , k255p ;
200
- float im1 , im2 , imf1 , imf2 , ims1 , ims2 , imd , imd1 , imd2 , imdc ;
201
- float sumd , sumd1 , sumd2 , sumdc , sumdl , sumd1l , sumd2l , sumdcl ;
202
- int i , j , i0 , j0 , i1 , j1 , i2 , j2 , k , ki0 , ki , kj , n ;
203
-
204
- old = inbuf ;
205
- new = outbuf ;
206
- exp1n = exp (-1 );
207
- k332 = (3.0f * 3.0f * 2.0f + 1.0f ) / (3.0f * 3.0f * 2.0f - 1.0f );
208
- k255p = 1.0f / 255.0f ;
209
-
210
- k = 0 ;
211
- sumd = 0.0f ;
212
- sumd1 = 0.0f ;
213
- sumd2 = 0.0f ;
214
- sumdc = 0.0f ;
215
- for (i = 0 ; i < height ; i ++ )
216
- {
217
- sumdl = 0.0f ;
218
- sumd1l = 0.0f ;
219
- sumd2l = 0.0f ;
220
- sumdcl = 0.0f ;
221
- i0 = i - 1 ;
222
- if (i0 < 0 ) {i0 = 0 ;}
223
- i2 = i + 2 ;
224
- if (i2 > height ) {i2 = height ;}
225
- ki0 = i0 * width ;
226
- for (j = 0 ; j < width ; j ++ )
227
- {
228
- j0 = j - 1 ;
229
- if (j0 < 0 ) {j0 = 0 ;}
230
- j2 = j + 2 ;
231
- if (j2 > width ) {j2 = width ;}
232
- im1 = (float )old [k ];
233
- im2 = (float )new [k ];
234
- n = 0 ;
235
- ims1 = 0.0f ;
236
- ims2 = 0.0f ;
237
- ki = ki0 ;
238
- for (i1 = i0 ; i1 < i2 ; i1 ++ )
239
- {
240
- for (j1 = j0 ; j1 < j2 ; j1 ++ )
241
- {
242
- kj = ki + j1 ;
243
- imf1 = (float )old [kj ];
244
- ims1 += imf1 ;
245
- imf2 = (float )new [kj ];
246
- ims2 += imf2 ;
247
- n ++ ;
248
- }
249
- ki += width ;
250
- }
251
- ims1 /= (float )n ;
252
- ims2 /= (float )n ;
253
- imd1 = im1 - ims1 ;
254
- imd2 = im2 - ims2 ;
255
- im1 += imd1 ;
256
- im2 += imd2 ;
257
- imd = im1 - im2 ;
258
- imd1 *= k255p ;
259
- imd2 *= k255p ;
260
- imd *= k255p ;
261
- imd *= imd ;
262
- imdc = imd1 * imd2 ;
263
- imd1 *= imd1 ;
264
- imd2 *= imd2 ;
265
- sumdl += imd ;
266
- sumd1l += imd1 ;
267
- sumd2l += imd2 ;
268
- sumdcl += imdc ;
269
- k ++ ;
270
- }
271
- sumd += sumdl ;
272
- sumd1 += sumd1l ;
273
- sumd2 += sumd2l ;
274
- sumdc += sumdcl ;
275
- }
276
- sumd2 *= sumd1 ;
277
- if (sumd2 > 0.0f )
278
- {
279
- sumd /= sumd2 ;
280
- sumd *= sumdc ;
281
- sumd *= 2.0f ;
282
- } else {
283
- sumd /= (float )height ;
284
- sumd /= (float )width ;
285
- }
286
- if (sumd < 0.0f ) {sumd = - sumd ;}
287
- sumd = sqrt (sumd );
288
- sumd = - sumd ;
289
- sumd *= exp1n ;
290
- sumd += k332 ;
291
-
292
- sharpenbad = sumd ;
293
-
294
- return sharpenbad ;
295
- }
296
-
203
+ /* COR(a,b) = E(a * b) / sqrt(E(a * a) * E(b * b)) */
297
204
float metric_cor (uint8_t * inbuf , uint8_t * outbuf , int width , int height )
298
205
{
299
206
uint8_t * old , * new ;
@@ -365,6 +272,7 @@ float metric_cor (uint8_t *inbuf, uint8_t *outbuf, int width, int height)
365
272
return cor ;
366
273
}
367
274
275
+ /* CORSH(a,b) = E(GR(a,r) * GR(b,r)) / sqrt(E(GR(a,r) * GR(a,r)) * E(GR(b,r) * GR(b,r))) */
368
276
float metric_corsharp (uint8_t * inbuf , uint8_t * outbuf , int width , int height , int radius )
369
277
{
370
278
uint8_t * old , * new ;
@@ -469,6 +377,76 @@ float metric_corsharp (uint8_t *inbuf, uint8_t *outbuf, int width, int height, i
469
377
return cor ;
470
378
}
471
379
380
+ /* SHARPENBAD(a,b,r) = (2* GR(a,r) * GR(b,r) + C) / (GR(a,r) * GR(a,r) + GR(b,r) * GR(b,r) + C)
381
+ * GR(a,r) = a * n - E(a,r)
382
+ * GR(b,r) = b * n - E(b,r)
383
+ * C = 1 */
384
+ float metric_sharpenbad (uint8_t * inbuf , uint8_t * outbuf , int width , int height , int radius )
385
+ {
386
+ uint8_t * ref , * cmp ;
387
+ int y , x , y0 , x0 , y1 , x1 , yf , xf , di , n ;
388
+ size_t k , ky0 , kx0 , kf0 , kf ;
389
+ float sum1 , sum2 , ssl , ss , sql , sq , si , sharpenbad , c ;
390
+
391
+ ref = inbuf ;
392
+ cmp = outbuf ;
393
+ sharpenbad = 0.0f ;
394
+ c = 1.0f ;
395
+ if (radius > 0 )
396
+ {
397
+ ss = 0.0f ;
398
+ sq = 0.0f ;
399
+ k = 0 ;
400
+ for (y = 0 ; y < height ; y ++ )
401
+ {
402
+ y0 = y - radius ;
403
+ y0 = (y0 < 0 ) ? 0 : y0 ;
404
+ y1 = y + radius + 1 ;
405
+ y1 = (y1 < height ) ? y1 : height ;
406
+ ky0 = y0 * width ;
407
+ ssl = 0.0f ;
408
+ sql = 0.0f ;
409
+ for (x = 0 ; x < width ; x ++ )
410
+ {
411
+ x0 = x - radius ;
412
+ x0 = (x0 < 0 ) ? 0 : x0 ;
413
+ x1 = x + radius + 1 ;
414
+ x1 = (x1 < width ) ? x1 : width ;
415
+ kx0 = x0 ;
416
+ kf0 = ky0 + kx0 ;
417
+ kf = kf0 ;
418
+ sum1 = 0.0f ;
419
+ sum2 = 0.0f ;
420
+ n = 0 ;
421
+ for (yf = y0 ; yf < y1 ; yf ++ )
422
+ {
423
+ for (xf = x0 ; xf < x1 ; xf ++ )
424
+ {
425
+ sum1 -= (float )ref [kf ];
426
+ sum2 -= (float )cmp [kf ];
427
+ n ++ ;
428
+ kf ++ ;
429
+ }
430
+ kf0 += width ;
431
+ kf = kf0 ;
432
+ }
433
+ n = (n > 0 ) ? n : 1 ;
434
+ sum1 += (float )(n * (int )ref [k ]);
435
+ sum2 += (float )(n * (int )cmp [k ]);
436
+ ssl += (2.0f * sum1 * sum2 + c );
437
+ sql += ((sum1 * sum1 ) + (sum2 * sum2 ) + c );
438
+ k ++ ;
439
+ }
440
+ ss += ssl ;
441
+ sq += sql ;
442
+ }
443
+ }
444
+ sharpenbad = ss / sq ;
445
+
446
+ return sharpenbad ;
447
+ }
448
+
449
+ /* S(M) = 1 - sqrt(1 - M * M) */
472
450
float cor_sigma (float cor )
473
451
{
474
452
float sigma ;
@@ -494,6 +472,7 @@ int index_clamp (int i, int a, int b)
494
472
return buf [(int )(i > a ) + (int )(i > b )];
495
473
}
496
474
475
+ /* GR(a,1) */
497
476
int pix_sharpen3 (uint8_t * inbuf , int width , int height , int i , int j , int k )
498
477
{
499
478
int res = 0 , di0 , di1 , dj0 , dj1 ;
@@ -513,9 +492,13 @@ int pix_sharpen3 (uint8_t *inbuf, int width, int height, int i, int j, int k)
513
492
res -= inbuf [k + di0 + dj1 ];
514
493
res -= inbuf [k + di1 + dj0 ];
515
494
res -= inbuf [k + di1 + dj1 ];
495
+
516
496
return res ;
517
497
}
518
498
499
+ /* NHW(a,b,r) = E((a - b) * (a - b) * (GR(a,r) - GR(b,r))) / E(GR(a,r) - GR(b,r))
500
+ * GR(a,r) = a * n - E(a,r)
501
+ * GR(b,r) = b * n - E(b,r) */
519
502
float metric_nhw (uint8_t * inbuf , uint8_t * outbuf , int width , int height )
520
503
{
521
504
uint8_t * old , * new ;
0 commit comments