Skip to content

Instantly share code, notes, and snippets.

@0x5d
Created July 28, 2018 16:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 0x5d/68e7898a74d4a3a21ee8c5dfd31f7f07 to your computer and use it in GitHub Desktop.
Save 0x5d/68e7898a74d4a3a21ee8c5dfd31f7f07 to your computer and use it in GitHub Desktop.
final float brightness = 200;
void setup() {
noLoop();
PImage img, mask;
img = loadImage("img.jpg");
mask = loadImage("mask.jpg");
img.loadPixels();
mask.loadPixels();
PImage sorted1 = sortRows(img, mask);
sorted1.loadPixels();
PImage sorted2 = sortColumns(sorted1, mask);
sorted2.updatePixels();
sorted2.save("sorted-rows-columns.jpg");
exit();
}
PImage sortColumns(PImage img, PImage mask) {
for (int x = 0; x < img.width; x++) {
int start = getStartColumn(x, 0, mask);
while (start < img.height) {
int end = getEndColumn(x, start, mask);
int sortLength = end - start;
color[] unsorted = new color[sortLength];
for(int i = 0; i < sortLength; i++) {
unsorted[i] = img.pixels[(start + i) * img.width + x];
}
color[] sorted = sort(unsorted);
for(int i = 0; i < sortLength; i++) {
img.pixels[(start + i) * img.width + x] = sorted[i];
}
start = getStartColumn(x, end + 1, mask);
}
}
return img;
}
PImage sortRows(PImage img, PImage mask) {
for (int y = 0; y < img.height; y++) {
int start = getStartRow(y, 0, mask);
while (start < img.width) {
int end = getEndRow(y, start, mask);
int sortLength = end - start;
color[] unsorted = new color[sortLength];
for(int i = 0; i < sortLength; i++) {
unsorted[i] = img.pixels[y * img.width + (start + i)];
}
color[] sorted = sort(unsorted);
for(int i = 0; i < sortLength; i++) {
img.pixels[y * img.width + (start + i)] = sorted[i];
}
start = getStartRow(y, end + 1, mask);
}
}
return img;
}
int getStartColumn(int col, int start, PImage mask) {
for (int i = start; i < mask.height; i++) {
if (brightness(mask.pixels[i * mask.width + col]) > brightness) {
return i;
}
}
return start;
}
int getEndColumn(int col, int start, PImage mask) {
for (int i = start; i < mask.height; i++) {
if (brightness(mask.pixels[i * mask.width + col]) < brightness) {
return i;
}
}
return mask.height - 1;
}
int getStartRow(int row, int start, PImage mask) {
for (int i = start; i < mask.width; i++) {
if (brightness(mask.pixels[row * mask.width + i]) > brightness) {
return i;
}
}
return start;
}
int getEndRow(int row, int start, PImage mask) {
for (int i = start; i < mask.width; i++) {
if (brightness(mask.pixels[row * mask.width + i]) < brightness) {
return i;
}
}
return mask.width - 1;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment