isefire icon

Sobel

isefire | PRO | 07/27/14 06:09:31 PM UTC | 0 ⭐ | 437 👁️ | Never ⏰ | []
Java |

4.1 KB

|

None

|

0 👍

/

0 👎

/* Sobel
 * <Description>
 * Displays result of the Sobel method for image processing run on an image.
 * <Usage>
 * javac Sobel.java Picture.java Luminance.java
 * java Sobel picture.jpg
 * <References>
 * http://introcs.cs.princeton.edu/java/31datatype/Luminance.java.html
 * http://introcs.cs.princeton.edu/java/stdlib/Picture.java.html
 * CIS201L-2014-Summer Dr. Sloan
 * @author
 * Dan Latham
 * <[email protected]>
 * @version 0.0.1
 *
 */
import java.awt.Color;
public class Sobel
{
    public static int multiply(int[] filter, Color[] bynine)
    {
        int a = 0;
        for (int i = 0; i < filter.length; i+=1)
        {
            Color z = bynine[i];
            int y = z.getRed();
            y = y*filter[i];
            a += y;
        }
        return a;
    }
    public static Picture sobel(Picture initpicture, Picture resultpicture)
    {
        int[] filter1 = {-1, 0, 1,
                        -2, 0, 2,
                        -1, 0, 1};
        int[] filter2 = {1, 2, 1,
                        0, 0, 0,
                        -1, -2, -1};
        int y0 = initpicture.height();
        int x0 = initpicture.width();
        //get and set color of each pixel
        for (int x = 0; x < x0; x+=1)
        {
            for (int y = 0; y < y0; y+=1)
            {
                //start at top left, iterate down to bottom right
                //declare boundary pixels first(default case)
                Color initcolor1 = new Color(255,255,255);
                Color initcolor2 = new Color(255,255,255);
                Color initcolor3 = new Color(255,255,255);
                Color initcolor4 = new Color(255,255,255);
                Color initcolor5 = initpicture.get(x,y);
                Color initcolor6 = new Color(255,255,255);
                Color initcolor7 = new Color(255,255,255);
                Color initcolor8 = new Color(255,255,255);
                Color initcolor9 = new Color(255,255,255);
                //System.out.println(initcolor5);
                //top left
                try
                {
                    initcolor1 = initpicture.get(x-1,y-1);
                }
                catch(IndexOutOfBoundsException A)
                {
                    continue;
                }
                //top middle
                try
                {
                    initcolor2 = initpicture.get(x,y-1);
                }
                catch(IndexOutOfBoundsException A)
                {
                    continue;
                }
                //top right
                try
                {
                    initcolor3 = initpicture.get(x+1,y-1);
                }
                catch(IndexOutOfBoundsException A)
                {
                    continue;
                }
                //middle left
                try
                {
                    initcolor4 = initpicture.get(x-1,y);
                }
                catch(IndexOutOfBoundsException A)
                {
                    continue;
                }
                //middle right
                try
                {
                    initcolor6 = initpicture.get(x+1,y);
                }
                catch(IndexOutOfBoundsException A)
                {
                    continue;
                }
                //bottom left
                try
                {
                    initcolor7 = initpicture.get(x-1,y+1);
                }
                catch(IndexOutOfBoundsException A)
                {
                    continue;
                }
                //bottom middle
                try
                {
                    initcolor8 = initpicture.get(x,y+1);
                }
                catch(IndexOutOfBoundsException A)
                {
                    continue;
                }
                //bottom right
                try
                {
                    initcolor9 = initpicture.get(x+1,y+1);
                }
                catch(IndexOutOfBoundsException A)
                {
                    continue;
                }
                Color[] bynine = {initcolor1, initcolor2, initcolor3, initcolor4, initcolor5, initcolor6, initcolor7, initcolor8, initcolor9};
                int Gx = multiply(filter1, bynine);
                int Gy = multiply(filter2, bynine);
                int colornum =(int) Math.abs(255-Math.sqrt((Gx*Gx)+(Gy*Gy)));
                if (colornum > 255) colornum=255;
                //System.out.println(colornum);
                Color colorgrey = new Color(colornum,colornum,colornum);
                resultpicture.set(x,y,colorgrey);
                
            }
        }
        return resultpicture;
    }
    
    public static Picture ggrayscale(Picture picture)
    {
        int y0 = picture.height();
        int x0 = picture.width();
        //get color of each pixel, convert to grayscale, set color to gray
        for (int x = 0; x < x0; x+=1)
        {
            for (int y = 0; y < y0; y+=1)
            {
                java.awt.Color initcolor = picture.get(x,y);
                java.awt.Color graycolor = Luminance.toGray(initcolor);
                int r = graycolor.getRed();
                int b = graycolor.getBlue();
                int g = graycolor.getGreen();
                
                java.awt.Color newcolor = new java.awt.Color(r,g,b);
                picture.set(x, y, newcolor);
            }
        }
        return picture;
    }
    
    public static void main(String[] args)
    {
        Picture initpicture = new Picture(args[0]);
        Picture resultpicture = new Picture(initpicture.width(),initpicture.height());
        initpicture = ggrayscale(initpicture);
        resultpicture = sobel(initpicture, resultpicture);
        resultpicture.show();
    }
}

Comments