Skip to content

Commit d66ca57

Browse files
committed
0.2.0: reimplementation SHARPENBAD
1 parent 572a5a2 commit d66ca57

File tree

5 files changed

+94
-106
lines changed

5 files changed

+94
-106
lines changed

CHANGELOG

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
libsmallfry.
22

3+
0.2.0
4+
5+
reimplementation SHARPENBAD:
6+
metric_sharpenbad
7+
38
0.1.3
49

510
Norm Version:

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ RM = @rm -fv
99
RMDIR = @rm -frv
1010
PLIB = lib$(PNAME)
1111
VERSION_MAJOR = 0
12-
VERSION_MINOR = 1
13-
VERSION_RELEASE = 3
12+
VERSION_MINOR = 2
13+
VERSION_RELEASE = 0
1414
PREFIX = /usr/local
1515
INCPREFIX = $(PREFIX)/include
1616
LIBPREFIX = $(PREFIX)/lib

smallfry.pc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ includedir=${prefix}/include
44

55
Name: smallfry
66
Description: Library Smallfry metric for JPEG Optimization
7-
Version: 0.1.3
7+
Version: 0.2.0
88
Libs: -L${libdir} -lsmallfry -lm
99
Cflags: -I${includedir}

src/smallfry.c

Lines changed: 85 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222

2323
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
2424
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
25-
#define LIBSMALLFRYVERSION "0.1.3"
25+
#define LIBSMALLFRYVERSION "0.2.0"
2626

27+
/* PSNR(a,b) = 10*log10(MAX * MAX / E((a-b)*(a-b)))
28+
* MAX = 255 */
2729
static float factor_psnr (uint8_t *orig, uint8_t *cmp, int orig_stride, int cmp_stride, int width, int height, uint8_t max)
2830
{
2931
uint8_t *old, *new;
@@ -58,6 +60,8 @@ static float factor_psnr (uint8_t *orig, uint8_t *cmp, int orig_stride, int cmp_
5860
return MAX(MIN(ret, 1.0f), 0.0f);
5961
}
6062

63+
/* AAE(a,b) = K * E(a(GRID) - b(GRID))
64+
* GRID = {{0,7},8} */
6165
static float factor_aae (uint8_t *orig, uint8_t *cmp, int orig_stride, int cmp_stride, int width, int height, uint8_t max)
6266
{
6367
uint8_t *old, *new;
@@ -178,6 +182,9 @@ static uint8_t maxluma (uint8_t *buf, int stride, int width, int height)
178182
return max;
179183
}
180184

185+
/* SMALLFRY(a,b) = (K1 * PSNR(a,b) + K2 * AAE(a,b))
186+
* K1 = 37.1891885161239
187+
* K2 = 78.5328607296973 */
181188
float metric_smallfry (uint8_t *inbuf, uint8_t *outbuf, int width, int height)
182189
{
183190
float p, a, b;
@@ -193,107 +200,7 @@ float metric_smallfry (uint8_t *inbuf, uint8_t *outbuf, int width, int height)
193200
return b;
194201
}
195202

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)) */
297204
float metric_cor (uint8_t *inbuf, uint8_t *outbuf, int width, int height)
298205
{
299206
uint8_t *old, *new;
@@ -365,6 +272,7 @@ float metric_cor (uint8_t *inbuf, uint8_t *outbuf, int width, int height)
365272
return cor;
366273
}
367274

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))) */
368276
float metric_corsharp (uint8_t *inbuf, uint8_t *outbuf, int width, int height, int radius)
369277
{
370278
uint8_t *old, *new;
@@ -469,6 +377,76 @@ float metric_corsharp (uint8_t *inbuf, uint8_t *outbuf, int width, int height, i
469377
return cor;
470378
}
471379

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) */
472450
float cor_sigma (float cor)
473451
{
474452
float sigma;
@@ -494,6 +472,7 @@ int index_clamp (int i, int a, int b)
494472
return buf[(int)(i > a) + (int)(i > b)];
495473
}
496474

475+
/* GR(a,1) */
497476
int pix_sharpen3 (uint8_t *inbuf, int width, int height, int i, int j, int k)
498477
{
499478
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)
513492
res -= inbuf[k + di0 + dj1];
514493
res -= inbuf[k + di1 + dj0];
515494
res -= inbuf[k + di1 + dj1];
495+
516496
return res;
517497
}
518498

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) */
519502
float metric_nhw (uint8_t *inbuf, uint8_t *outbuf, int width, int height)
520503
{
521504
uint8_t *old, *new;

src/smallfry.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
#define SMALLFLY_METRIC_H
1919

2020
float metric_smallfry (uint8_t *inbuf, uint8_t *outbuf, int width, int height);
21-
float metric_sharpenbad (uint8_t *inbuf, uint8_t *outbuf, int width, int height);
2221
float metric_cor (uint8_t *inbuf, uint8_t *outbuf, int width, int height);
2322
float metric_corsharp (uint8_t *inbuf, uint8_t *outbuf, int width, int height, int radius);
23+
float metric_sharpenbad (uint8_t *inbuf, uint8_t *outbuf, int width, int height, int radius);
2424
float metric_nhw (uint8_t *inbuf, uint8_t *outbuf, int width, int height);
2525
float cor_sigma (float cor);
2626
char* libsmallfry_version (void);

0 commit comments

Comments
 (0)