David maybe the original C script (well look as C to me , but i may be wrong) is easier to port.
The Lua filter was derieved by this
here #include <stddef.h>
#include <imapio.h>
#include <stdimap.h>
/*-----------------------------------------------------------------
Kuwahara Filter
12/01/99
filename: kuwahara.lc
author : W.J.Bokhove
----------------------------------------------------------------*/
/*
M_DOCDEF kuwahara
NAME kuwahara
SYNOPSIS
void kuwahara(src, dst, lines)
sep uchar src[]; /* source image */ /*
sep uchar dst[]; /* destination image */ /*
uint lines; /* number of lines to work on */ /*
MEMORY CONSUMPTION
This function consumes about 22 lines of IMAP memory
DESCRIPTION
Performs the Kuwahara Filter. This filter is an edge-preserving filter.
( a a ab b b)
( a a ab b b)
(ac ac abcd bd bd)
( c c cd d d)
( c c cd d d)
In each of the four regions (a, b, c, d), the mean brightness and the
variance are calculated. The output value of the center pixel (abcd) in
the window is the mean value of that region that has the smallest variance.
M_DOCEND
*/
void kuwahara(sep uchar src[], sep uchar dst[], uint lines)
{
#define square(a) (a*a)
int i;
sep ulong dif;
sep uint dtmp1, dtmp2, dtmp3, dtmp4, acc;
sep uchar var[3], mean[3], vartmp, meantmp;
dst[0] = 0;
dst[1] = 0;
/* Calculate Variance and Mean of first 2 lines */
dtmp2 = square((src[0] - :>src[1]));
dtmp3 = square((src[0] - src[1]));
dtmp4 = square((src[0] - :<src[1]));
dif = :<dtmp2 + dtmp3 + :>dtmp4;
dtmp1 = square((src[1] - :>src[1]));
dif += dtmp1;
dif += :<dtmp1;
dtmp2 = square((src[1] - :>src[2]));
dif += dtmp2;
dtmp3 = square((src[1] - src[2]));
dif += dtmp3;
dtmp4 = square((src[1] - :<src[2]));
dif += dtmp4;
var[1] = dif;
dif = :<dtmp2 + dtmp3 + :>dtmp4;
dtmp1 = square((src[2] - :>src[2]));
dif += dtmp1;
dif += :<dtmp1;
dtmp2 = square((src[2] - :>src[3]));
dif += dtmp2;
dtmp3 = square((src[2] - src[3]));
dif += dtmp3;
dtmp4 = square((src[2] - :<src[3]));
dif += dtmp4;
var[2] = dif;
acc = src[0] + src[1] + src[2];
acc += (:<acc + :>acc);
mean[1] = acc / 9;
acc = src[2] + src[2] + src[3];
acc += (:<acc + :>acc);
mean[2] = acc / 9;
for (i=3 ; i<lines-1; i++ ) {
/* Calculate Variance */
dif = :<dtmp2 + dtmp3 + :>dtmp4;
dtmp1 = square((src[i] - :>src[i]));
dif += dtmp1;
dif += :<dtmp1;
dtmp2 = square((src[i] - :>src[i+1]));
dif += dtmp2;
dtmp3 = square((src[i] - src[i+1]));
dif += dtmp3;
dtmp4 = square((src[i] - :<src[i+1]));
dif += dtmp4;
var[3]= sqrtsepi(dif>>3);
/* Calculate Mean */
acc = src[i-1] + src[i] + src[i+1];
acc += (:<acc + :>acc);
mean[3] = acc / 9;
/* Find minimum variance and its mean */
vartmp = :>var[1];
meantmp = :>mean[1];
mif (:<var[1] < vartmp) {meantmp = :<mean[1]; vartmp = :<var[1];}
mif (:>var[3] < vartmp) {meantmp = :>mean[3]; vartmp = :>var[3];}
mif (:<var[3] < vartmp) meantmp = :<mean[3];
dst[i-1] = meantmp;
var[1] = var[2]; mean[1] = mean[2];
var[2] = var[3]; mean[2] = mean[3];
}
dst[lines-2] = 0;
dst[lines-1] = 0;
From
http://web.archive.org/web/200803130937 ... uwahara.lc