Last active
April 23, 2020 18:30
-
-
Save brianfakhoury/446dedf2d29915424d74811c4d452db8 to your computer and use it in GitHub Desktop.
Highly precise, low-interpretation, image smoothing algorithm which iterates over an image array in memory, and make far less read/writes than normal.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
typedef struct { | |
unsigned short red; | |
unsigned short green; | |
unsigned short blue; | |
} pixel; | |
char smooth2_descr[] = "smooth: NOT succint"; | |
void smooth2(int dim, pixel *src, pixel *dst) { | |
int i = 0, j = 0; | |
// CASE row 1 | |
// First pixel | |
// Write-out to right, corner, bottom | |
dst[i+1].red = src[i].red/6; | |
dst[i+1].green = src[i].green/6; | |
dst[i+1].blue = src[i].blue/6; // right | |
dst[i+dim+1].red = src[i].red/9; | |
dst[i+dim+1].green = src[i].green/9; | |
dst[i+dim+1].blue = src[i].blue/9; // corner | |
dst[i+dim].red = src[i].red/6; | |
dst[i+dim].green = src[i].green/6; | |
dst[i+dim].blue = src[i].blue/6; // bottom | |
// Read-in mechanism: normal | |
dst[i].red = src[i].red/4 + src[i+1].red / 4 + src[i+dim+1].red / 4 + src[i+dim].red / 4; | |
dst[i].green = src[i].green/4 + src[i+1].green / 4 + src[i+dim+1].green / 4 + src[i+dim].green / 4; | |
dst[i].blue = src[i].blue/4 + src[i+1].blue / 4 + src[i+dim+1].blue / 4 + src[i+dim].blue / 4; | |
// Second pixel | |
i++; | |
// Write-out to right, corner, bottom | |
dst[i+1].red = src[i].red/6; | |
dst[i+1].green = src[i].green/6; | |
dst[i+1].blue = src[i].blue/6; // right | |
dst[i+dim+1].red = src[i].red/9; | |
dst[i+dim+1].green = src[i].green/9; | |
dst[i+dim+1].blue = src[i].blue/9; // corner | |
dst[i+dim].red += src[i].red/9; | |
dst[i+dim].green += src[i].green/9; | |
dst[i+dim].blue += src[i].blue/9; // bottom | |
dst[i+dim-1].red += src[i].red/6; | |
dst[i+dim-1].green += src[i].green/6; | |
dst[i+dim-1].blue += src[i].blue/6; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/6 + src[i+1].red / 6 + src[i+dim+1].red / 6 + src[i+dim].red / 6; | |
dst[i].green += src[i].green/6 + src[i+1].green / 6 + src[i+dim+1].green / 6 + src[i+dim].green / 6; | |
dst[i].blue += src[i].blue/6 + src[i+1].blue / 6 + src[i+dim+1].blue / 6 + src[i+dim].blue / 6; | |
// Loop over pixels up to dim-2 | |
for (j = 2; j < dim - 2; j++) { | |
dst[j+1].red = src[j].red/6; | |
dst[j+1].green = src[j].green/6; | |
dst[j+1].blue = src[j].blue/6; // right | |
dst[j+dim+1].red = src[j].red/9; | |
dst[j+dim+1].green = src[j].green/9; | |
dst[j+dim+1].blue = src[j].blue/9; // corner | |
dst[j+dim].red += src[j].red/9; | |
dst[j+dim].green += src[j].green/9; | |
dst[j+dim].blue += src[j].blue/9; // bottom | |
dst[j+dim-1].red += src[j].red/9; | |
dst[j+dim-1].green += src[j].green/9; | |
dst[j+dim-1].blue += src[j].blue/9; // b2 | |
// Read-in mechanism: normal | |
dst[j].red += src[j].red/6 + src[j+1].red / 6 + src[j+dim+1].red / 6 + src[j+dim].red / 6; | |
dst[j].green += src[j].green/6 + src[j+1].green / 6 + src[j+dim+1].green / 6 + src[j+dim].green / 6; | |
dst[j].blue += src[j].blue/6 + src[j+1].blue / 6 + src[j+dim+1].blue / 6 + src[j+dim].blue / 6; | |
} | |
// Second to last pixel | |
i = dim - 2; | |
// Write-out to b1,right;corner;bottom | |
dst[i+1].red = src[i].red/4; | |
dst[i+1].green = src[i].green/4; | |
dst[i+1].blue = src[i].blue/4; // right | |
dst[i+dim+1].red = src[i].red/6; | |
dst[i+dim+1].green = src[i].green/6; | |
dst[i+dim+1].blue = src[i].blue/6; // corner | |
dst[i+dim].red += src[i].red/9; | |
dst[i+dim].green += src[i].green/9; | |
dst[i+dim].blue += src[i].blue/9; // bottom | |
dst[i+dim-1].red += src[i].red/9; | |
dst[i+dim-1].green += src[i].green/9; | |
dst[i+dim-1].blue += src[i].blue/9; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/6 + src[i+1].red / 6 + src[i+dim+1].red / 6 + src[i+dim].red / 6; | |
dst[i].green += src[i].green/6 + src[i+1].green / 6 + src[i+dim+1].green / 6 + src[i+dim].green / 6; | |
dst[i].blue += src[i].blue/6 + src[i+1].blue / 6 + src[i+dim+1].blue / 6 + src[i+dim].blue / 6; | |
// Last pixel | |
i++; | |
// Write-out to bottom;b2 | |
dst[i+dim].red += src[i].red/6; | |
dst[i+dim].green += src[i].green/6; | |
dst[i+dim].blue += src[i].blue/6; // bottom | |
dst[i+dim-1].red += src[i].red/9; | |
dst[i+dim-1].green += src[i].green/9; | |
dst[i+dim-1].blue += src[i].blue/9; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/4 + src[i+dim].red / 4; | |
dst[i].green += src[i].green/4 + src[i+dim].green / 4; | |
dst[i].blue += src[i].blue/4 + src[i+dim].blue / 4; | |
// CASE row 2 | |
// First pixel | |
i++; | |
// Write-out to b1,right;corner;bottom | |
dst[i-dim+1].red += src[i].red/6; | |
dst[i-dim+1].green += src[i].green/6; | |
dst[i-dim+1].blue += src[i].blue/6; //b1 | |
dst[i+1].red += src[i].red/9; | |
dst[i+1].green += src[i].green/9; | |
dst[i+1].blue += src[i].blue/9; // right | |
dst[i+dim+1].red = src[i].red/9; | |
dst[i+dim+1].green = src[i].green/9; | |
dst[i+dim+1].blue = src[i].blue/9; // corner | |
dst[i+dim].red += src[i].red/6; | |
dst[i+dim].green += src[i].green/6; | |
dst[i+dim].blue += src[i].blue/6; // bottom | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/6 + src[i+1].red / 6 + src[i+dim+1].red / 6 + src[i+dim].red / 6; | |
dst[i].green += src[i].green/6 + src[i+1].green / 6 + src[i+dim+1].green / 6 + src[i+dim].green / 6; | |
dst[i].blue += src[i].blue/6 + src[i+1].blue / 6 + src[i+dim+1].blue / 6 + src[i+dim].blue / 6; | |
// Second pixel | |
i++; | |
// Write-out to b1,right;corner;bottom | |
dst[i-dim+1].red += src[i].red/6; | |
dst[i-dim+1].green += src[i].green/6; | |
dst[i-dim+1].blue += src[i].blue/6; //b1 | |
dst[i+1].red += src[i].red/9; | |
dst[i+1].green += src[i].green/9; | |
dst[i+1].blue += src[i].blue/9; // right | |
dst[i+dim+1].red = src[i].red/9; | |
dst[i+dim+1].green = src[i].green/9; | |
dst[i+dim+1].blue = src[i].blue/9; // corner | |
dst[i+dim].red += src[i].red/9; | |
dst[i+dim].green += src[i].green/9; | |
dst[i+dim].blue += src[i].blue/9; // bottom | |
dst[i+dim-1].red += src[i].red/6; | |
dst[i+dim-1].green += src[i].green/6; | |
dst[i+dim-1].blue += src[i].blue/6; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/9 + src[i+1].red / 9 + src[i+dim+1].red / 9 + src[i+dim].red / 9; | |
dst[i].green += src[i].green/9 + src[i+1].green / 9 + src[i+dim+1].green / 9 + src[i+dim].green / 9; | |
dst[i].blue += src[i].blue/9 + src[i+1].blue / 9 + src[i+dim+1].blue / 9 + src[i+dim].blue / 9; | |
// Loop over pixels up to dim-2 | |
for (j = dim + 2; j < dim + dim - 2; j++) { | |
dst[j-dim+1].red += src[j].red/6; | |
dst[j-dim+1].green += src[j].green/6; | |
dst[j-dim+1].blue += src[j].blue/6; //b1 | |
dst[j+1].red += src[j].red/9; | |
dst[j+1].green += src[j].green/9; | |
dst[j+1].blue += src[j].blue/9; // right | |
dst[j+dim+1].red = src[j].red/9; | |
dst[j+dim+1].green = src[j].green/9; | |
dst[j+dim+1].blue = src[j].blue/9; // corner | |
dst[j+dim].red += src[j].red/9; | |
dst[j+dim].green += src[j].green/9; | |
dst[j+dim].blue += src[j].blue/9; // bottom | |
dst[j+dim-1].red += src[j].red/9; | |
dst[j+dim-1].green += src[j].green/9; | |
dst[j+dim-1].blue += src[j].blue/9; // b2 | |
// Read-in mechanism: normal | |
dst[j].red += src[j].red/9 + src[j+1].red / 9 + src[j+dim+1].red / 9 + src[j+dim].red / 9; | |
dst[j].green += src[j].green/9 + src[j+1].green / 9 + src[j+dim+1].green / 9 + src[j+dim].green / 9; | |
dst[j].blue += src[j].blue/9 + src[j+1].blue / 9 + src[j+dim+1].blue / 9 + src[j+dim].blue / 9; | |
} | |
// Second to last pixel | |
// Write-out to b1,right;corner;bottom | |
dst[i-dim+1].red += src[i].red/4; | |
dst[i-dim+1].green += src[i].green/4; | |
dst[i-dim+1].blue += src[i].blue/4; //b1 | |
dst[i+1].red += src[i].red/6; | |
dst[i+1].green += src[i].green/6; | |
dst[i+1].blue += src[i].blue/6; // right | |
dst[i+dim+1].red = src[i].red/6; | |
dst[i+dim+1].green = src[i].green/6; | |
dst[i+dim+1].blue = src[i].blue/6; // corner | |
dst[i+dim].red += src[i].red/9; | |
dst[i+dim].green += src[i].green/9; | |
dst[i+dim].blue += src[i].blue/9; // bottom | |
dst[i+dim-1].red += src[i].red/9; | |
dst[i+dim-1].green += src[i].green/9; | |
dst[i+dim-1].blue += src[i].blue/9; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/9 + src[i+1].red / 9 + src[i+dim+1].red / 9 + src[i+dim].red / 9; | |
dst[i].green += src[i].green/9 + src[i+1].green / 9 + src[i+dim+1].green / 9 + src[i+dim].green / 9; | |
dst[i].blue += src[i].blue/9 + src[i+1].blue / 9 + src[i+dim+1].blue / 9 + src[i+dim].blue / 9; | |
// Last pixel | |
// Write-out to bottom;b2 | |
dst[i+dim].red += src[i].red/6; | |
dst[i+dim].green += src[i].green/6; | |
dst[i+dim].blue += src[i].blue/6; // bottom | |
dst[i+dim-1].red += src[i].red/9; | |
dst[i+dim-1].green += src[i].green/9; | |
dst[i+dim-1].blue += src[i].blue/9; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/6 + src[i+dim].red / 6; | |
dst[i].green += src[i].green/6 + src[i+dim].green / 6; | |
dst[i].blue += src[i].blue/6 + src[i+dim].blue / 6; | |
// CASE row 3:dim-3 | |
// General Body. Loop over rows | |
for (i = dim+dim; i < dim - 2; i+=dim) { | |
// First pixel | |
// Write-out to b1,right;corner;bottom | |
dst[i-dim+1].red += src[i].red/9; | |
dst[i-dim+1].green += src[i].green/9; | |
dst[i-dim+1].blue += src[i].blue/9; //b1 | |
dst[i+1].red += src[i].red/9; | |
dst[i+1].green += src[i].green/9; | |
dst[i+1].blue += src[i].blue/9; // right | |
dst[i+dim+1].red = src[i].red/9; | |
dst[i+dim+1].green = src[i].green/9; | |
dst[i+dim+1].blue = src[i].blue/9; // corner | |
dst[i+dim].red = src[i].red/6; | |
dst[i+dim].green = src[i].green/6; | |
dst[i+dim].blue = src[i].blue/6; // bottom | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/6 + src[i+1].red / 6 + src[i+dim+1].red / 6 + src[i+dim].red / 6; | |
dst[i].green += src[i].green/6 + src[i+1].green / 6 + src[i+dim+1].green / 6 + src[i+dim].green / 6; | |
dst[i].blue += src[i].blue/6 + src[i+1].blue / 6 + src[i+dim+1].blue / 6 + src[i+dim].blue / 6; | |
// Second pixel | |
// Write-out to b1,right;corner;bottom | |
dst[i-dim+1].red += src[i].red/9; | |
dst[i-dim+1].green += src[i].green/9; | |
dst[i-dim+1].blue += src[i].blue/9; //b1 | |
dst[i+1].red += src[i].red/9; | |
dst[i+1].green += src[i].green/9; | |
dst[i+1].blue += src[i].blue/9; // right | |
dst[i+dim+1].red = src[i].red/9; | |
dst[i+dim+1].green = src[i].green/9; | |
dst[i+dim+1].blue = src[i].blue/9; // corner | |
dst[i+dim].red += src[i].red/9; | |
dst[i+dim].green += src[i].green/9; | |
dst[i+dim].blue += src[i].blue/9; // bottom | |
dst[i+dim-1].red += src[i].red/6; | |
dst[i+dim-1].green += src[i].green/6; | |
dst[i+dim-1].blue += src[i].blue/6; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/9 + src[i+1].red / 9 + src[i+dim+1].red / 9 + src[i+dim].red / 9; | |
dst[i].green += src[i].green/9 + src[i+1].green / 9 + src[i+dim+1].green / 9 + src[i+dim].green / 9; | |
dst[i].blue += src[i].blue/9 + src[i+1].blue / 9 + src[i+dim+1].blue / 9 + src[i+dim].blue / 9; | |
// Loop over pixels up to dim-2 | |
for (j = i + 2; j < i + dim - 2; j++) { | |
dst[j-dim+1].red += src[j].red/9; | |
dst[j-dim+1].green += src[j].green/9; | |
dst[j-dim+1].blue += src[j].blue/9; //b1 | |
dst[j+1].red += src[j].red/9; | |
dst[j+1].green += src[j].green/9; | |
dst[j+1].blue += src[j].blue/9; // right | |
dst[j+dim+1].red = src[j].red/9; | |
dst[j+dim+1].green = src[j].green/9; | |
dst[j+dim+1].blue = src[j].blue/9; // corner | |
dst[j+dim].red += src[j].red/9; | |
dst[j+dim].green += src[j].green/9; | |
dst[j+dim].blue += src[j].blue/9; // bottom | |
dst[j+dim-1].red += src[j].red/9; | |
dst[j+dim-1].green += src[j].green/9; | |
dst[j+dim-1].blue += src[j].blue/9; // b2 | |
// Read-in mechanism: normal | |
dst[j].red += src[j].red/9 + src[j+1].red / 9 + src[j+dim+1].red / 9 + src[j+dim].red / 9; | |
dst[j].green += src[j].green/9 + src[j+1].green / 9 + src[j+dim+1].green / 9 + src[j+dim].green / 9; | |
dst[j].blue += src[j].blue/9 + src[j+1].blue / 9 + src[j+dim+1].blue / 9 + src[j+dim].blue / 9; | |
} | |
// Second to last pixel | |
// Write-out to b1,right;corner;bottom | |
dst[i-dim+1].red += src[i].red/6; | |
dst[i-dim+1].green += src[i].green/6; | |
dst[i-dim+1].blue += src[i].blue/6; //b1 | |
dst[i+1].red += src[i].red/6; | |
dst[i+1].green += src[i].green/6; | |
dst[i+1].blue += src[i].blue/6; // right | |
dst[i+dim+1].red = src[i].red/6; | |
dst[i+dim+1].green = src[i].green/6; | |
dst[i+dim+1].blue = src[i].blue/6; // corner | |
dst[i+dim].red += src[i].red/9; | |
dst[i+dim].green += src[i].green/9; | |
dst[i+dim].blue += src[i].blue/9; // bottom | |
dst[i+dim-1].red += src[i].red/9; | |
dst[i+dim-1].green += src[i].green/9; | |
dst[i+dim-1].blue += src[i].blue/9; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/9 + src[i+1].red / 9 + src[i+dim+1].red / 9 + src[i+dim].red / 9; | |
dst[i].green += src[i].green/9 + src[i+1].green / 9 + src[i+dim+1].green / 9 + src[i+dim].green / 9; | |
dst[i].blue += src[i].blue/9 + src[i+1].blue / 9 + src[i+dim+1].blue / 9 + src[i+dim].blue / 9; | |
// Last pixel | |
// Write-out to bottom;b2 | |
dst[i+dim].red += src[i].red/6; | |
dst[i+dim].green += src[i].green/6; | |
dst[i+dim].blue += src[i].blue/6; // bottom | |
dst[i+dim-1].red += src[i].red/9; | |
dst[i+dim-1].green += src[i].green/9; | |
dst[i+dim-1].blue += src[i].blue/9; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/6 + src[i+dim].red / 6; | |
dst[i].green += src[i].green/6 + src[i+dim].green / 6; | |
dst[i].blue += src[i].blue/6 + src[i+dim].blue / 6; | |
} | |
// CASE second to last row | |
// First pixel | |
i = dim * dim - dim - dim; | |
// Write-out to b1,right;corner;bottom | |
dst[i-dim+1].red += src[i].red/9; | |
dst[i-dim+1].green += src[i].green/9; | |
dst[i-dim+1].blue += src[i].blue/9; //b1 | |
dst[i+1].red += src[i].red/9; | |
dst[i+1].green += src[i].green/9; | |
dst[i+1].blue += src[i].blue/9; // right | |
dst[i+dim+1].red = src[i].red/6; | |
dst[i+dim+1].green = src[i].green/6; | |
dst[i+dim+1].blue = src[i].blue/6; // corner | |
dst[i+dim].red = src[i].red/4; | |
dst[i+dim].green = src[i].green/4; | |
dst[i+dim].blue = src[i].blue/4; // bottom | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/6 + src[i+1].red / 6 + src[i+dim+1].red / 6 + src[i+dim].red / 6; | |
dst[i].green += src[i].green/6 + src[i+1].green / 6 + src[i+dim+1].green / 6 + src[i+dim].green / 6; | |
dst[i].blue += src[i].blue/6 + src[i+1].blue / 6 + src[i+dim+1].blue / 6 + src[i+dim].blue / 6; | |
// Second pixel | |
i++; | |
// Write-out to b1,right;corner;bottom | |
dst[i-dim+1].red += src[i].red/9; | |
dst[i-dim+1].green += src[i].green/9; | |
dst[i-dim+1].blue += src[i].blue/9; //b1 | |
dst[i+1].red += src[i].red/9; | |
dst[i+1].green += src[i].green/9; | |
dst[i+1].blue += src[i].blue/9; // right | |
dst[i+dim+1].red = src[i].red/6; | |
dst[i+dim+1].green = src[i].green/6; | |
dst[i+dim+1].blue = src[i].blue/6; // corner | |
dst[i+dim].red += src[i].red/6; | |
dst[i+dim].green += src[i].green/6; | |
dst[i+dim].blue += src[i].blue/6; // bottom | |
dst[i+dim-1].red += src[i].red/4; | |
dst[i+dim-1].green += src[i].green/4; | |
dst[i+dim-1].blue += src[i].blue/4; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/9 + src[i+1].red / 9 + src[i+dim+1].red / 9 + src[i+dim].red / 9; | |
dst[i].green += src[i].green/9 + src[i+1].green / 9 + src[i+dim+1].green / 9 + src[i+dim].green / 9; | |
dst[i].blue += src[i].blue/9 + src[i+1].blue / 9 + src[i+dim+1].blue / 9 + src[i+dim].blue / 9; | |
// Loop over pixels up to dim-2 | |
for (j = dim * dim - dim - dim + 2; j < dim * dim - dim - 2; j++) { | |
dst[j-dim+1].red += src[j].red/9; | |
dst[j-dim+1].green += src[j].green/9; | |
dst[j-dim+1].blue += src[j].blue/9; //b1 | |
dst[j+1].red += src[j].red/9; | |
dst[j+1].green += src[j].green/9; | |
dst[j+1].blue += src[j].blue/9; // right | |
dst[j+dim+1].red = src[j].red/6; | |
dst[j+dim+1].green = src[j].green/6; | |
dst[j+dim+1].blue = src[j].blue/6; // corner | |
dst[j+dim].red += src[j].red/6; | |
dst[j+dim].green += src[j].green/6; | |
dst[j+dim].blue += src[j].blue/6; // bottom | |
dst[j+dim-1].red += src[j].red/6; | |
dst[j+dim-1].green += src[j].green/6; | |
dst[j+dim-1].blue += src[j].blue/6; // b2 | |
// Read-in mechanism: normal | |
dst[j].red += src[j].red/9 + src[j+1].red / 9 + src[j+dim+1].red / 9 + src[j+dim].red / 9; | |
dst[j].green += src[j].green/9 + src[j+1].green / 9 + src[j+dim+1].green / 9 + src[j+dim].green / 9; | |
dst[j].blue += src[j].blue/9 + src[j+1].blue / 9 + src[j+dim+1].blue / 9 + src[j+dim].blue / 9; | |
} | |
// Second to last pixel | |
i = dim * dim - dim - 2; | |
// Write-out to b1,right;corner;bottom | |
dst[i-dim+1].red += src[i].red/6; | |
dst[i-dim+1].green += src[i].green/6; | |
dst[i-dim+1].blue += src[i].blue/6; //b1 | |
dst[i+1].red += src[i].red/6; | |
dst[i+1].green += src[i].green/6; | |
dst[i+1].blue += src[i].blue/6; // right | |
dst[i+dim+1].red = src[i].red/4; | |
dst[i+dim+1].green = src[i].green/4; | |
dst[i+dim+1].blue = src[i].blue/4; // corner | |
dst[i+dim].red += src[i].red/6; | |
dst[i+dim].green += src[i].green/6; | |
dst[i+dim].blue += src[i].blue/6; // bottom | |
dst[i+dim-1].red += src[i].red/6; | |
dst[i+dim-1].green += src[i].green/6; | |
dst[i+dim-1].blue += src[i].blue/6; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/9 + src[i+1].red / 9 + src[i+dim+1].red / 9 + src[i+dim].red / 9; | |
dst[i].green += src[i].green/9 + src[i+1].green / 9 + src[i+dim+1].green / 9 + src[i+dim].green / 9; | |
dst[i].blue += src[i].blue/9 + src[i+1].blue / 9 + src[i+dim+1].blue / 9 + src[i+dim].blue / 9; | |
// Last pixel | |
i++; | |
// Write-out to bottom;b2 | |
dst[i+dim].red += src[i].red/4; | |
dst[i+dim].green += src[i].green/4; | |
dst[i+dim].blue += src[i].blue/4; // bottom | |
dst[i+dim-1].red += src[i].red/6; | |
dst[i+dim-1].green += src[i].green/6; | |
dst[i+dim-1].blue += src[i].blue/6; // b2 | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/6 + src[i+dim].red / 6; | |
dst[i].green += src[i].green/6 + src[i+dim].green / 6; | |
dst[i].blue += src[i].blue/6 + src[i+dim].blue / 6; | |
// CASE last row | |
// First pixel | |
i++; | |
// Write-out to b1,right;corner;bottom | |
dst[i-dim+1].red += src[i].red/9; | |
dst[i-dim+1].green += src[i].green/9; | |
dst[i-dim+1].blue += src[i].blue/9; //b1 | |
dst[i+1].red += src[i].red/9; | |
dst[i+1].green += src[i].green/9; | |
dst[i+1].blue += src[i].blue/9; // right | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/4 + src[i+1].red / 4; | |
dst[i].green += src[i].green/4 + src[i+1].green / 4; | |
dst[i].blue += src[i].blue/4 + src[i+1].blue / 4; | |
// Loop over pixels up to dim-2 | |
for (j = dim * dim - dim + 1; j < dim * dim - 2; j++) { | |
dst[j-dim+1].red += src[j].red/9; | |
dst[j-dim+1].green += src[j].green/9; | |
dst[j-dim+1].blue += src[j].blue/9; //b1 | |
dst[j+1].red += src[j].red/6; | |
dst[j+1].green += src[j].green/6; | |
dst[j+1].blue += src[j].blue/6; // right | |
// Read-in mechanism: normal | |
dst[j].red += src[j].red/6 + src[j+1].red / 6; | |
dst[j].green += src[j].green/6 + src[j+1].green / 6; | |
dst[j].blue += src[j].blue/6 + src[j+1].blue / 6; | |
} | |
// Second to last pixel | |
i = dim * dim - 2; | |
// Write-out to b1,right;corner;bottom | |
dst[i-dim+1].red += src[i].red/6; | |
dst[i-dim+1].green += src[i].green/6; | |
dst[i-dim+1].blue += src[i].blue/6; //b1 | |
dst[i+1].red += src[i].red/4; | |
dst[i+1].green += src[i].green/4; | |
dst[i+1].blue += src[i].blue/4; // right | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/6 + src[i+1].red / 6; | |
dst[i].green += src[i].green/6 + src[i+1].green / 6; | |
dst[i].blue += src[i].blue/6 + src[i+1].blue / 6; | |
// Last pixel | |
i++; | |
// Read-in mechanism: normal | |
dst[i].red += src[i].red/4; | |
dst[i].green += src[i].green/4; | |
dst[i].blue += src[i].blue/4; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The main point of this code is to demonstrate a highly precise, low-interpretation, image smoothing algorithm which iterates over an image array in memory, and make far less read/writes than normal. It works by only ever reading from the 3 pixels at the bottom right corner of a given pixel, and writing out to the space again to the bottom right, therefore minimizing to the point where, for each pixel, its memory contents only need to be read one single time.