@Override
    public Imagem aplica(Imagem imagem) {
        Imagem novaImagem = new Imagem(imagem.getWidth(), imagem.getHeight());
        
        boolean mudou = true;
        
        while(mudou) {
            mudou = false;
        
            int metadeTamanho = (int) Math.floor((float)getTamanho() / 2);

            for(int x = metadeTamanho; x < imagem.getWidth() - metadeTamanho; x++) {
                for(int y = metadeTamanho; y < imagem.getHeight() - metadeTamanho; y++) {
                    int[][] pixels = new int[getTamanho()][getTamanho()];

                    for(int x2 = 0; x2 < getTamanho(); x2++) {
                        for(int y2 = 0; y2 < getTamanho(); y2++) {
                            pixels[x2][y2] = imagem.getPixel(x + x2 - metadeTamanho, y + y2 - metadeTamanho);
                        }
                    }

                    int v = Math.max(Math.min(calcula(pixels), 255), 0);
                    
                    if(v != imagem.getPixel(x, y)) {
                        mudou = true;
                    }
                    
                    novaImagem.setPixel(x, y, v);
                }
            }
            
            imagem = novaImagem;
            
        }
        return novaImagem;
    }