Skip to content

Commit 7b6a9c7

Browse files
committed
0.20230314: filter: Gauss Blur: small line buffer
1 parent 833de4c commit 7b6a9c7

File tree

4 files changed

+60
-77
lines changed

4 files changed

+60
-77
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ CC = gcc
55
CPP = g++
66
CFLAGS = -DUNIX -I$(SRCS) -Wall -s
77
VER = 0
8-
VERB = 20230226
8+
VERB = 20230314
99
ifeq ($(OS),Windows_NT)
1010
LIBS = FreeImage.lib
1111
PLIBF = $(PNAME).$(VER).dll

doc/imthreshold/CHANGELOG

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
0.20230314
2+
3+
Filter: Gauss Blur: small line buffer
4+
15
0.20230226
26

37
Threshold: added bayer and dots

doc/imthreshold/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.20230226
1+
0.20230314

src/lib/filter.c

Lines changed: 54 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -859,121 +859,100 @@ void IMTGaussLineMatrix (float *cmatrix, float radius)
859859

860860
//////////////////////////////////////////////////////////////////////////////////////////////
861861

862-
void IMTFilterGaussBlur (IMTpixel** p_im, IMTpixel** d_im, unsigned height, unsigned width, float radius)
862+
void IMTFilterGaussBlur (IMTpixel** p_im, IMTpixel** d_im, unsigned int height, unsigned int width, float radius)
863863
{
864-
int iradius;
865-
int y, x, yf, xf, i;
866-
unsigned d;
867-
float imc;
868-
float sc[3];
869-
float* gaussmat;
870-
IMTpixel** t_im;
871-
int h = (int)height;
872-
int w = (int)width;
864+
unsigned int iradius, hw, y, x, i, d;
865+
float imc, sc, *gaussmat, *buf;
873866

874-
if (radius < 0)
867+
if (radius < 0.0f)
875868
{
876869
radius = -radius;
877870
}
878-
iradius = (int)(2.0 * radius + 0.5) + 1;
871+
iradius = (int)(2.0f * radius + 0.5f) + 1;
872+
hw = (height < width) ? width : height;
873+
hw += iradius;
874+
hw += iradius;
879875

880-
gaussmat = (float*)malloc((iradius) * sizeof(float));
881-
t_im = IMTalloc(height, width);
876+
gaussmat = (float*)malloc(iradius * sizeof(float));
877+
buf = (float*)malloc(hw * sizeof(float));
882878

883879
IMTGaussLineMatrix (gaussmat, radius);
884880

885881
if (iradius > 1)
886882
{
887-
for (y = 0; y < h; y++)
883+
for (d = 0; d < 3; d++)
888884
{
889-
for (x = 0; x < w; x++)
885+
for (y = 0; y < height; y++)
890886
{
891-
for (d = 0; d < 3; d++)
887+
for (x = 0; x < iradius; x++)
892888
{
893-
imc = (float)p_im[y][x].c[d];
894-
sc[d] = imc * gaussmat[0];
889+
buf[x] = (float)p_im[y][0].c[d];
890+
buf[width + iradius + x] = (float)p_im[y][width - 1].c[d];
895891
}
896-
for (i = 1; i < iradius; i++)
892+
for (x = 0; x < width; x++)
897893
{
898-
yf = y - i;
899-
if (yf < 0)
900-
{
901-
yf = 0;
902-
}
903-
for (d = 0; d < 3; d++)
904-
{
905-
imc = (float)p_im[yf][x].c[d];
906-
sc[d] += imc * gaussmat[i];
907-
}
908-
yf = y + i;
909-
if (yf >= h)
910-
{
911-
yf = h - 1;
912-
}
913-
for (d = 0; d < 3; d++)
914-
{
915-
imc = (float)p_im[yf][x].c[d];
916-
sc[d] += imc * gaussmat[i];
917-
}
894+
buf[x + iradius] = (float)p_im[y][x].c[d];
918895
}
919-
for (d = 0; d < 3; d++)
896+
for (x = 0; x < width; x++)
920897
{
921-
t_im[y][x].c[d] = ByteClamp((int)(sc[d] + 0.5));
898+
imc = buf[x + iradius];
899+
sc = imc * gaussmat[0];
900+
for (i = 1; i < iradius; i++)
901+
{
902+
imc = buf[x + iradius - i];
903+
sc += imc * gaussmat[i];
904+
imc = buf[x + iradius + i];;
905+
sc += imc * gaussmat[i];
906+
}
907+
d_im[y][x].c[d] = ByteClamp((int)(sc + 0.5f));
922908
}
923909
}
924-
}
925-
for (y = 0; y < h; y++)
926-
{
927-
for (x = 0; x < w; x++)
910+
for (x = 0; x < width; x++)
928911
{
929-
for (d = 0; d < 3; d++)
912+
for (y = 0; y < iradius; y++)
930913
{
931-
imc = (float)t_im[y][x].c[d];
932-
sc[d] = imc * gaussmat[0];
914+
buf[y] = (float)d_im[0][x].c[d];
915+
buf[height + iradius + y] = (float)d_im[height - 1][x].c[d];
933916
}
934-
for (i = 1; i < iradius; i++)
917+
for (y = 0; y < height; y++)
935918
{
936-
xf = x - i;
937-
if (xf < 0)
938-
{
939-
xf = 0;
940-
}
941-
for (d = 0; d < 3; d++)
942-
{
943-
imc = (float)t_im[y][xf].c[d];
944-
sc[d] += imc * gaussmat[i];
945-
}
946-
xf = x + i;
947-
if (xf >= w)
948-
{
949-
xf = w - 1;
950-
}
951-
for (d = 0; d < 3; d++)
952-
{
953-
imc = (float)t_im[y][xf].c[d];
954-
sc[d] += imc * gaussmat[i];
955-
}
919+
buf[y + iradius] = (float)d_im[y][x].c[d];
956920
}
957-
for (d = 0; d < 3; d++)
921+
for (y = 0; y < height; y++)
958922
{
959-
d_im[y][x].c[d] = ByteClamp((int)(sc[d] + 0.5));
923+
imc = buf[y + iradius];
924+
sc = imc * gaussmat[0];
925+
for (i = 1; i < iradius; i++)
926+
{
927+
imc = buf[y + iradius - i];
928+
sc += imc * gaussmat[i];
929+
imc = buf[y + iradius + i];
930+
sc += imc * gaussmat[i];
931+
}
932+
d_im[y][x].c[d] = ByteClamp((int)(sc + 0.5f));
960933
}
934+
}
935+
}
936+
for (y = 0; y < height; y++)
937+
{
938+
for (x = 0; x < width; x++)
939+
{
961940
d_im[y][x] = IMTcalcS (d_im[y][x]);
962941
}
963942
}
964943
}
965944
else
966945
{
967-
for (y = 0; y < h; y++)
946+
for (y = 0; y < height; y++)
968947
{
969-
for (x = 0; x< w; x++)
948+
for (x = 0; x < width; x++)
970949
{
971950
d_im[y][x] = p_im[y][x];
972951
}
973952
}
974953
}
975954

976-
IMTfree(t_im, height);
955+
free(buf);
977956
free(gaussmat);
978957
}
979958

0 commit comments

Comments
 (0)