Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package mr.gonzalez;
- import images.*;
- import java.io.*;
- import java.util.*;
- public class SeamCarving {
- public static void main(String[] args) throws FileNotFoundException {
- // TODO Auto-generated method stub
- Scanner r = new Scanner(System.in);
- System.out.println("filename:");
- String filename = r.next();
- System.out.println("number seams:");
- int numSeams = r.nextInt();
- APImage image = new APImage(filename);
- //before
- image.draw();
- int[][] values = new int[image.getWidth()][image.getHeight()];
- int[][] bestSeam = new int[image.getHeight()+1][2]; //last index is cost
- bestSeam[image.getHeight()][0] = Integer.MAX_VALUE;
- int[][] currentSeam = new int[image.getHeight()+1][2];
- currentSeam[image.getHeight()][0] = 0;
- Pixel p;
- for (int x = 0; x < image.getWidth(); x++) {
- for (int y = 0; y < image.getHeight(); y++) {
- p = image.getPixel(x, y);
- values[x][y] = (p.getBlue()+p.getGreen()+p.getRed())/3;
- }
- }
- int currentX, currentY, currentValue, cost;
- for (int x = 0; x < image.getWidth(); x++) {
- //get the seam
- currentSeam[0] = new int[] {x, 0};
- for (int y = 1; y < image.getHeight(); y++) {
- currentX = currentSeam[y-1][0];
- currentY = currentSeam[y-1][1];
- currentValue = values[currentX][currentY];
- if (currentX == 0) { // prevent hitting edge of picture
- cost = Math.min(Math.abs(values[currentX][y] - currentValue), Math.abs(values[currentX+1][y] - currentValue));
- currentSeam[y] = new int[] { cost, y};
- currentSeam[image.getHeight()][0] += cost;
- } else if (currentX == image.getWidth()-1) {
- cost = Math.min(Math.abs(values[currentX][y] - currentValue), Math.abs(values[currentX-1][y] - currentValue));
- currentSeam[y] = new int[] { cost, y};
- currentSeam[image.getHeight()][0] += cost;
- } else {
- cost = Math.min(Math.min(Math.abs(values[currentX][y] - currentValue), Math.abs(values[currentX-1][y] - currentValue)), Math.abs(values[currentX+1][y] - currentValue));
- currentSeam[y] = new int[] {cost, y};
- currentSeam[image.getHeight()][0] += cost;
- }
- }
- if (currentSeam[image.getHeight()][0] < bestSeam[image.getHeight()][0])
- bestSeam = currentSeam.clone();
- }
- //after
- image.draw();
- }
- public APImage carve(APImage image, int[][] points) {
- APImage carved = new APImage(image.getWidth()-1, image.getHeight()-1);
- int xc = 0, yc = 0;
- Pixel p;
- for (int x = 0; x < image.getWidth(); x++) {
- for (int y = 0; y < image.getHeight(); y++) {
- for (int[] a: points) {
- if (!(x == a[0] && y == a[1])) {
- p = image.getPixel(x, y);
- carved.setPixel(xc, yc, p);
- xc++;
- yc++;
- }
- }
- }
- }
- return carved;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement