public BufferedImage Generate(BufferedImage img){
		
		// Initialize the channels
		
		double[][] red = new double[img.getHeight()][img.getWidth()];
		double[][] green = new double[img.getHeight()][img.getWidth()];
		double[][] blue = new double[img.getHeight()][img.getWidth()];
		
		for(int y = 0; y < img.getHeight(); y++){
			for(int x = 0; x < img.getWidth(); x++){
				Color color = new Color(img.getRGB(x, y));
				red[y][x] = color.getRed();
				green[y][x] = color.getGreen();
				blue[y][x] = color.getBlue();
			}
		}
		
		// Generate average kernel
		
		double[][] OPERATOR_X = this.OPERATOR_X();
		double[][] OPERATOR_Y = this.OPERATOR_Y();
		
		double[][] kernel = new double[OPERATOR_X.length][OPERATOR_X[0].length];
		
		for(int y = 0; y < OPERATOR_Y.length; y++){
			for(int x = 0; x < OPERATOR_X.length; x++){
				kernel[y][x] = (OPERATOR_X[y][x] +OPERATOR_Y[y][x]) / 2;
			}
		}
		
		// Execute the convolutions
		
		red = this.Convolve(red, kernel);
		green = this.Convolve(green, kernel);
		blue = this.Convolve(blue, kernel);
		
		// Combine the channels
		
		for(int y = 0; y < img.getHeight(); y++){
			for(int x = 0; x < img.getWidth(); x++){
				Color color = new Color((int) (red[y][x] * 256), (int) (green[y][x] * 256), (int) (blue[y][x] * 256));
				img.setRGB(x, y, color.getRGB());
			}
		}
		
		// Return the image
		
		return img;
	}