Skip to content

Instantly share code, notes, and snippets.

@mnd999
Created March 23, 2014 10:39
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 mnd999/9721401 to your computer and use it in GitHub Desktop.
Save mnd999/9721401 to your computer and use it in GitHub Desktop.
package javascratch;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.Color;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import javax.swing.*;
import javax.imageio.ImageIO;
public class EdgeDetect {
public static void main(String[] args) throws Exception {
final String tim = "20140320_002.jpg";
final String dog = "penis-dog.jpg";
BufferedImage bi = ImageIO.read(EdgeDetect.class.getResourceAsStream(tim));
JFrame f = new JFrame();
JPanel mypanel = new MyPanel(bi.getData(), 500, 700);
// JPanel mypanel = new MyPanel(bi.getData(), 0, 0);
f.getContentPane().add(mypanel);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(1000, 1000);
f.setVisible(true);
}
static class MyPanel extends JPanel {
private Raster r;
private int ox;
private int oy;
public MyPanel(Raster r, int ox, int oy) {
this.r = r;
this.ox = ox;
this.oy = oy;
}
public void paint(Graphics g) {
int oldValue1, oldValue2, oldValue3, value1 = 0, value2 = 0, value3 = 0;
Color imgcol;
for (int x = 0; x < Math.min(1000,r.getWidth()-1); x++) {
for (int y = 0; y < Math.min(1000, r.getHeight()-1); y++) {
List<Integer> avgs = getAvgForPixels(r, y+oy, x+ox);
int colour1 = avgs.get(0);
int colour2 = avgs.get(1);
int colour3 = avgs.get(2);
oldValue1 = value1;
oldValue2 = value2;
oldValue3 = value3;
value1 = colour1;
value2 = colour2;
value3 = colour3;
int delta1 = value1 - oldValue1;
int delta2 = value2 - oldValue2;
int delta3 = value3 - oldValue3;
double path1= Math.sqrt(delta1 * delta1 + delta2 * delta2 + delta3 * delta3);
double avg = (delta1 + delta2 + delta3) / 3;
double max = Math.max(delta1, Math.max(delta2, delta3));
if (path1>1.2) {
imgcol = new Color(0, 0, 0);
} else {
imgcol = new Color(255,255,255);
}
g.setColor(imgcol);
g.drawLine(x, y, x, y);
}
}
}
private List<Integer> getAvgForPixels(Raster r, int x, int y) {
int size = 5;
int xoffset = (x - ((size -1) / 2)) < 0 ? 0 : (x - ((size -1) / 2));
int yoffset = (y - ((size -1) / 2)) < 0 ? 0 : (y - ((size -1) / 2));
int width = xoffset + size < r.getWidth() ? size : r.getWidth() - xoffset;
int height = yoffset + size < r.getHeight() ? size : r.getHeight() - yoffset;
int[] values = r.getPixels(xoffset, yoffset, width, height, new int[(size* size)*3]);
Integer[] colours = new Integer[] { 0,0,0 };
for (int i =0; i < (size * size)-1; i++) {
colours[i%3] += values[i];
}
return Arrays.asList(colours).stream().map(col -> col / (size * size)).collect(Collectors.toList());
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment