import java.awt.image.*;
import java.awt.*;
import javax.imageio.*;
import java.util.Hashtable;

// classe dei kernel di vari filtri
public class Locali
{

   public BufferedImage sobelX(BufferedImage immagine)  // Metodo che implementa il filtro SobelX
    {
          ConvolveOp op=new ConvolveOp(new Kernels().kSobelX());
          BufferedImage copia=new BufferedImage(immagine.getWidth(),immagine.getHeight(),BufferedImage.TYPE_INT_RGB); //
          copiaImmagine(immagine,copia);
          BufferedImage temp=op.filter(copia,null);
        return temp;
    }

    public BufferedImage sobelY(BufferedImage immagine)  // Metodo che implementa il filtro SobelY
    {
          ConvolveOp op=new ConvolveOp(new Kernels().kSobelY());
          BufferedImage copia=new BufferedImage(immagine.getWidth(),immagine.getHeight(),BufferedImage.TYPE_INT_RGB); //
          copiaImmagine(immagine,copia);
          BufferedImage temp=op.filter(copia,null);
        return temp;
    }

    public BufferedImage prewittX(BufferedImage immagine)  // Metodo che implementa il filtro PrewittX
    {
          ConvolveOp op=new ConvolveOp(new Kernels().kPrewittX());
          BufferedImage copia=new BufferedImage(immagine.getWidth(),immagine.getHeight(),BufferedImage.TYPE_INT_RGB); //
          copiaImmagine(immagine,copia);
          BufferedImage temp=op.filter(copia,null);
        return temp;
    }

    public BufferedImage prewittY(BufferedImage immagine)  // Metodo che implementa il filtro PrewittY
    {
          ConvolveOp op=new ConvolveOp(new Kernels().kPrewittY());
          BufferedImage copia=new BufferedImage(immagine.getWidth(),immagine.getHeight(),BufferedImage.TYPE_INT_RGB); //
          copiaImmagine(immagine,copia);
          BufferedImage temp=op.filter(copia,null);
        return temp;
    }

    public BufferedImage laplaceX(BufferedImage immagine)  // Metodo che implementa il filtro PrewittX
    {
          ConvolveOp op=new ConvolveOp(new Kernels().kLaplaceX());
          BufferedImage copia=new BufferedImage(immagine.getWidth(),immagine.getHeight(),BufferedImage.TYPE_INT_RGB); //
          copiaImmagine(immagine,copia);
          BufferedImage temp=op.filter(copia,null);
        return temp;
    }

    public BufferedImage laplaceY(BufferedImage immagine)  // Metodo che implementa il filtro PrewittY
    {
          ConvolveOp op=new ConvolveOp(new Kernels().kLaplaceY());
          BufferedImage copia=new BufferedImage(immagine.getWidth(),immagine.getHeight(),BufferedImage.TYPE_INT_RGB); //
          copiaImmagine(immagine,copia);
          BufferedImage temp=op.filter(copia,null);
        return temp;
    }

    public BufferedImage sharpening(BufferedImage immagine)  // Metodo che implementa il filtro PrewittY
    {
          ConvolveOp op=new ConvolveOp(new Kernels().kSharpening());
          BufferedImage copia=new BufferedImage(immagine.getWidth(),immagine.getHeight(),BufferedImage.TYPE_INT_RGB); //
          copiaImmagine(immagine,copia);
          BufferedImage temp=op.filter(copia,null);
        return temp;
    }

    public BufferedImage nbox(BufferedImage immagine, int n)  // Metodo che implementa il filtro PrewittY
    {
          ConvolveOp op=new ConvolveOp(new Kernels().kNBox(n));
          BufferedImage copia=new BufferedImage(immagine.getWidth(),immagine.getHeight(),BufferedImage.TYPE_INT_RGB); //
          //copiaImmagine(immagine,copia);
          BufferedImage temp=op.filter(immagine,copia);
        return copia;
    }



    private void copiaImmagine(BufferedImage origine, BufferedImage dest) /*Copia un'immagine in una di destinazione*/
    {
        Graphics2D g2=dest.createGraphics();
        g2.drawImage(origine,0,0,null);
        g2.dispose();
    }

}
