/*----------------------------------------------- * * In-place 2D Convolution, zero-padded border (Host SUN4/40) * requires symmetric co-efficients */ #include #ifndef IMAGE #define IMAGE 4096 /* 1024x1024 or 4096x4096 */ #endif /* IMAGE */ #ifndef KERNEL_SIZE #define KERNEL_SIZE 3 /* NxN convolution */ #endif /* KERNEL_SIZE */ #define LOW (- KERNEL_SIZE/2) #define HIGH (KERNEL_SIZE+LOW-1) #define KERNEL_OFFSET (-LOW) #define WRITE_OFFSET (KERNEL_OFFSET+1) /* large enough for up * and down */ typedef unsigned char contype; static contype image[IMAGE + WRITE_OFFSET][ IMAGE], kernel[KERNEL_SIZE][ KERNEL_SIZE]; inline contype Image(int x, int y) { if (x < 0 || x >= IMAGE || y < 0 || y >= IMAGE) return (0); else return image[x][ y]; } void convolve() { register contype result; register int x, y, j, k; for (x = IMAGE - 1; x >= 0; x--) for (y = 0; y < IMAGE; y++) { result = 0; for (j = LOW; j <= HIGH; j++) for (k = LOW; k <= HIGH; k++) result += Image(x + j, y + k) * kernel[j + KERNEL_OFFSET][ k + KERNEL_OFFSET]; image[x + WRITE_OFFSET][ y] = result; } }