Desenhar com BufferedImage em cima de uma Imagem já existente

Olá pessoal,

Eu estou fazendo uma aplicação em que irá prescisar de fazer um labirinto e o usuário deve pegar o mouse e arrastar ate a saida.
O JFrame ao inicializar aparece certo, mas ao arrastar o mouse em cima do labirinto o programa da erro, e nada é escrito, segue-se abaixo o codigo:

Por favor alguém me ajude:
O grande problema que eu não sei o q esta errado, então se alguem souber por favor me ajude.

package LadiPackage;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.Point;
import java.awt.event.MouseEvent;
import javax.swing.event.MouseInputAdapter;
public class Teste2
{
    
    public static void main(String[] args)
    {
        FreeHand freeHand = new FreeHand();
        DrawingListener listener = new DrawingListener(freeHand);
        freeHand.addMouseListener(listener);
        freeHand.addMouseMotionListener(listener);
        JFrame MainFrame = new JFrame();
        MainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MainFrame.getContentPane().add(freeHand.getColorPanel(), "North");
        MainFrame.getContentPane().add(freeHand);
        MainFrame.getContentPane().add(freeHand.getControlPanel(), "South");
        MainFrame.setSize(600,400);
        MainFrame.setLocation(200,200);
        MainFrame.setVisible(true);
    }
}
public class FreeHand extends JPanel
{
    BufferedImage image;
    Color color;
    Stroke stroke;
    JLabel CoordenadasDoMouse;
    private Image BackugroundImage;
    private boolean Inicializadora;

    public FreeHand()
    {
        color = Color.blue;
        stroke = new BasicStroke(1f, BasicStroke.CAP_BUTT,
                                     BasicStroke.JOIN_MITER);
        this.initialize();
    }

    /*
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        if(image == null)
            initImage();
        g.drawImage(image, 0, 0, this);
    }
*/
    public void draw(Point start, Point end)
    {
        Graphics2D g2 = image.createGraphics();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setPaint(color);
        g2.setStroke(stroke);
        g2.draw(new Line2D.Double(start, end));
        g2.dispose();
        repaint();
    }

    private void clearImage()
    {
        Graphics g = image.getGraphics();
        g.setColor(getBackground());
        g.fillRect(0, 0, image.getWidth(), image.getHeight());
        g.dispose();
        repaint();
    }

    private void initImage()
    {
        int w = getWidth();
        int h = getHeight();
        image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = image.createGraphics();
        g2.setPaint(getBackground());
        g2.fillRect(0,0,w,h);
        g2.dispose();
    }
    protected void initialize()
    {
         this.BackugroundImage = this.getImage("/LadiPackage/resources/Teste2/imagem_teste2_labirinto.jpg");
         this.setLayout(new BorderLayout());
     }

     public Image getImage(String path)
     {
         URL imageURL = getClass().getResource(path);
         if (imageURL == null)
             return null;

         return new ImageIcon(imageURL).getImage();
     }
     
     public void paintComponent(Graphics g) {
         super.paintComponent(g);

         if( !Inicializadora )
         {
             Inicializadora = true;
             
             Dimension dDesktop = this.getSize();

             double width = dDesktop.getWidth();
             double height = dDesktop.getHeight();

             Image background = new ImageIcon(this.BackugroundImage.getScaledInstance(
                     (int) width, (int) height, 1)).getImage();

             g.drawImage(background, 0, 0, this);
         }
         else
         {
             if(image == null)
            initImage();
            g.drawImage(image, 0, 0, this);
         }
     }


    /**
     *
     * @param freeHand 
     * @return
     */

    protected FreeHand getDrawPanel( FreeHand freeHand )
    {
        return freeHand;
    }
    protected JPanel getColorPanel()
    {
        Color[] colors = {
            Color.red, Color.green.darker(), Color.blue, Color.orange
        };
        ActionListener l = new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                JButton button = (JButton)e.getSource();
                color = button.getBackground();
            }
        };
        JPanel panel = new JPanel(new GridLayout(1,0));
        for(int j = 0; j < colors.length; j++)
        {
            JButton button = new JButton("  ");
            button.setFocusPainted(false);
            button.setBackground(colors[j]);
            button.addActionListener(l);
            panel.add(button);
        }
        return panel;
    }

    protected JPanel getControlPanel()
    {
        JButton clear = new JButton("clear");
        clear.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                clearImage();
            }
        });
        final JSlider slider = new JSlider(JSlider.HORIZONTAL, 1, 6, 1);
        slider.addChangeListener(new ChangeListener()
        {
            public void stateChanged(ChangeEvent e)
            {
                float value = ((Integer)slider.getValue()).floatValue();
                stroke = new BasicStroke(value, BasicStroke.CAP_BUTT,
                                                BasicStroke.JOIN_MITER);
            }
        });
        JPanel panel = new JPanel();
        panel.add( insereLabelDeTextoCoordenadas() );
        panel.add( insereLabelCoordenadas() );
        panel.add(new JLabel("stroke"));
        panel.add(slider);
        panel.add(clear);
        return panel;
    }

    /* insere o Labels de coordenadas do mouse */
    private JLabel insereLabelDeTextoCoordenadas()
    {
        javax.swing.JLabel TextoCoordenadas;

        TextoCoordenadas = new JLabel();
        TextoCoordenadas.setText("Mouse Coordenadas: ");

        return TextoCoordenadas;
    }

    /* insere o Label que contem as coordenadas do mouse */
    private JLabel insereLabelCoordenadas()
    {
        CoordenadasDoMouse = new JLabel("");
        return CoordenadasDoMouse;
    }

    /* seta um texto no Label MouseCoordenadas */
    public void setTextJLabelMouseCoordenadas( String str )
    {
        CoordenadasDoMouse.setText(str);
    }
}
public class DrawingListener extends MouseInputAdapter
{
    FreeHand freeHand;
    Point start;

    public DrawingListener(FreeHand fh)
    {
        this.freeHand = fh;
    }

    public void mousePressed(MouseEvent e)
    {
        start = e.getPoint();
    }

    @Override
    public void mouseDragged(MouseEvent e)
    {
        Point p = e.getPoint();
        freeHand.draw(start, p);
        start = p;
        mouseMoved(e); // atualiza as coordenadas do mouse
    }

    /* atualiza as coordenadas do mouse na tela */
    public void mouseMoved(java.awt.event.MouseEvent evt)
    {
        String string = "(" + Integer.toString(evt.getX()) + ", "
            + Integer.toString(evt.getY()) + ")";
        freeHand.setTextJLabelMouseCoordenadas(string);
      }
}

O erro que aparece é este:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at LadiPackage.FreeHand.draw(FreeHand.java:59) at LadiPackage.DrawingListener.mouseDragged(DrawingListener.java:236)

Por favor alguém me ajude…
Desde já agradeço.

Me parece (não tenho certeza) que a imagem não existe ou o caminho está incorreto (lembre-se de diferenciar maiúsculas/minúsculas) e o método getImage() está retornando null causando esse NullPointerException.