零基础数据结构与算法——第七章:算法实践与工程应用-图像处理
7.4.1 搜索引擎
7.4.2 推荐系统
7.4.3 金融算法
7.4.4 图像处理
图像处理是算法在计算机视觉领域的应用,包括图像滤波、特征提取、目标检测等。
图像处理中使用的算法:
- 图像滤波:
public class ImageFilter {public static int[][] applyGaussianBlur(int[][] image, int radius) {int height = image.length;int width = image[0].length;// 创建高斯核double[][] kernel = createGaussianKernel(radius);// 应用滤波int[][] result = new int[height][width];for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {result[i][j] = applyKernel(image, i, j, kernel);}}return result;}private static double[][] createGaussianKernel(int radius) {int size = 2 * radius + 1;double sigma = radius / 3.0;double[][] kernel = new double[size][size];double sum = 0;for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {int x = i - radius;int y = j - radius;kernel[i][j] = Math.exp(-(x * x + y * y) / (2 * sigma * sigma));sum += kernel[i][j];}}// 归一化for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {kernel[i][j] /= sum;}}return kernel;}private static int applyKernel(int[][] image, int row, int col, double[][] kernel) {int height = image.length;int width = image[0].length;int radius = kernel.length / 2;double sum = 0;for (int i = 0; i < kernel.length; i++) {for (int j = 0; j < kernel[0].length; j++) {int r = row + i - radius;int c = col + j - radius;// 边界处理if (r >= 0 && r < height && c >= 0 && c < width) {sum += image[r][c] * kernel[i][j];}}}return (int) Math.round(sum);}
}
- 边缘检测:
public class EdgeDetection {public static int[][] applySobel(int[][] image) {int height = image.length;int width = image[0].length;// Sobel算子int[][] sobelX = {{-1, 0, 1},{-2, 0, 2},{-1, 0, 1}};int[][] sobelY = {{-1, -2, -1},{0, 0, 0},{1, 2, 1}};// 应用Sobel算子int[][] result = new int[height][width];for (int i = 1; i < height - 1; i++) {for (int j = 1; j < width - 1; j++) {int gx = applyKernel(image, i, j, sobelX);int gy = applyKernel(image, i, j, sobelY);// 计算梯度幅值int magnitude = (int) Math.sqrt(gx * gx + gy * gy);// 限制在0-255范围内result[i][j] = Math.min(255, magnitude);}}return result;}private static int applyKernel(int[][] image, int row, int col, int[][] kernel) {int sum = 0;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {sum += image[row + i - 1][col + j - 1] * kernel[i][j];}}return sum;}
}