Created
March 23, 2014 10:39
-
-
Save mnd999/9721401 to your computer and use it in GitHub Desktop.
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
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