当前位置: 首页 > article >正文

智能图像处理平台:图像处理配置类

这里我们先修改一下依赖,不用JavaCV,用openCV。

导入依赖:

        <!-- JavaCV 依赖,用于图像和视频处理 -->
<!--        <dependency>-->
<!--            <groupId>org.bytedeco</groupId>-->
<!--            <artifactId>javacv</artifactId>-->
<!--            <version>1.5.10</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.bytedeco</groupId>-->
<!--            <artifactId>javacpp</artifactId>-->
<!--            <version>1.5.10</version>-->
<!--        </dependency>-->
        <!-- OpenCV,计算机视觉库 -->
        <dependency>
            <groupId>org.openpnp</groupId>
            <artifactId>opencv</artifactId>
            <version>4.6.0-0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/opencv-460.jar</systemPath>
        </dependency>

编写图像处理配置类,包括图像拉取,图像处理、图像上传三个部分:

package com.llpp.tool;

import cn.hutool.http.ContentType;
import cn.hutool.http.HttpUtil;
import com.llpp.config.MinioConfig;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.CLAHE;
import org.opencv.imgproc.Imgproc;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Objects;
import java.util.UUID;


/**
 * @Author 21326
 * @Date 2025 2025/2/28 23:50
 */
@Component
public class ImageOperationTool {
    @Autowired
    private MinioConfig minioConfig;
    public static ImageOperationTool imageOperationTool;
    private static String PATH = ClassUtils.getDefaultClassLoader().getResource("openCV/opencv_java460.dll").getPath();

    static {
        System.load(PATH);
    }

    @PostConstruct
    public void init() {
        imageOperationTool = this;
        imageOperationTool.minioConfig = this.minioConfig;
    }

    public static String imageOperation(String url, String operation) {
        File output = new File("processed_image.jpg");
        FileInputStream fis = null;
        try {
            // 从 URL 读取图像数据
            output = HttpUtil.downloadFileFromUrl(url, output);
            // 将图像数据转换为 OpenCV 的 Mat 对象
            Mat mat = Imgcodecs.imread(output.getAbsolutePath());
            // 根据操作类型执行相应的操作
            Mat processedMat = performOperation(mat, operation);
            // 将处理后的 Mat 对象保存为文件
            Imgcodecs.imwrite(output.getAbsolutePath(), processedMat);
            // 将文件转换为 MultipartFile 对象
            fis = new FileInputStream(output);
            MultipartFile multipartFile = new MultipartFileTool(UUID.randomUUID().toString(), "image/jpg", ContentType.OCTET_STREAM.getValue(), fis);
            // 上传到 MinIO
            return imageOperationTool.minioConfig.putObject(multipartFile);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (Objects.nonNull(fis)) fis.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            output.delete();
        }
        return null;
    }

    private static Mat performOperation(Mat mat, String operation) {
        switch (operation.toLowerCase()) {
            case "gray": {
                // 灰度化
                Mat grayMat = new Mat();
                Imgproc.cvtColor(mat, grayMat, Imgproc.COLOR_BGR2GRAY);
                return grayMat;
            }
            case "scale": {
                // 缩放
                Mat scaledMat = new Mat();
                Imgproc.resize(mat, scaledMat, new Size(mat.width() / 2, mat.height() / 2));
                return scaledMat;
            }
            case "gaussianblur": {
                // 高斯滤波
                Mat gaussianMat = new Mat();
                Imgproc.GaussianBlur(mat, gaussianMat, new Size(3, 3), 0);
                return gaussianMat;
            }
            case "canny": {
                // 边缘检测
                Mat cannyMat = new Mat();
                Imgproc.Canny(mat, cannyMat, 100, 200);
                return cannyMat;
            }
            case "houghlines": {
                // 霍夫直线变换
                Mat lines = new Mat();
                Imgproc.HoughLines(mat, lines, 1, Math.PI / 180, 100, 0, 0, 0, Math.PI);
                Mat resultMat = new Mat(lines.rows(), 2, CvType.CV_32F);
                for (int i = 0; i < lines.rows(); i++) {
                    double[] line = lines.get(i, 0);
                    resultMat.put(i, 0, line[0]);
                    resultMat.put(i, 1, line[1]);
                }
                return resultMat;
            }
            case "sobel": {
                // Sobel边缘检测
                Mat sobelMat = new Mat();
                Imgproc.Sobel(mat, sobelMat, CvType.CV_8U, 1, 0);
                return sobelMat;
            }
            case "laplacian": {
                Mat laplacianMat = new Mat();
                Imgproc.Laplacian(mat, laplacianMat, CvType.CV_8U);
                return laplacianMat;
            }
            case "erode": {
                Mat erodeMat = new Mat();
                Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
                Imgproc.erode(mat, erodeMat, kernel);
                return erodeMat;
            }
            case "dilate": {
                Mat dilateMat = new Mat();
                Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
                Imgproc.dilate(mat, dilateMat, kernel);
                return dilateMat;
            }
            case "medianblur": {
                Mat medianBlurMat = new Mat();
                Imgproc.medianBlur(mat, medianBlurMat, 3);
                return medianBlurMat;
            }
            case "bilateralfilter": {
                Mat bilateralFilterMat = new Mat();
                Imgproc.bilateralFilter(mat, bilateralFilterMat, 9, 75, 75);
                return bilateralFilterMat;
            }
            case "threshold": {
                Mat thresholdMat = new Mat();
                Imgproc.threshold(mat, thresholdMat, 127, 255, Imgproc.THRESH_BINARY);
                return thresholdMat;
            }
            case "adaptivethreshold": {
                Mat adaptiveThresholdMat = new Mat();
                Imgproc.adaptiveThreshold(mat, adaptiveThresholdMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 11, 2);
                return adaptiveThresholdMat;
            }
            case "sift": {
                Mat siftMat = new Mat();
                return siftMat;
            }
            case "harris": {
                Mat harrisMat = new Mat();
                return harrisMat;
            }
            case "houghcircles": {
                Mat circles = new Mat();
                Imgproc.HoughCircles(mat, circles, Imgproc.HOUGH_GRADIENT, 1, mat.height() / 16, 100, 100, 0, 0);
                Mat resultMat = new Mat(circles.cols(), 3, CvType.CV_32F);
                for (int i = 0; i < circles.cols(); i++) {
                    double[] circle = circles.get(0, i);
                    resultMat.put(i, 0, circle[0]);
                    resultMat.put(i, 1, circle[1]);
                    resultMat.put(i, 2, circle[2]);
                }
                return resultMat;
            }
            case "clahe": {
                Mat claheMat = new Mat();
                CLAHE clahe = Imgproc.createCLAHE();
                clahe.apply(mat, claheMat);
                return claheMat;
            }
            case "rgb2hsv": {
                Mat hsvMat = new Mat();
                Imgproc.cvtColor(mat, hsvMat, Imgproc.COLOR_BGR2HSV);
                return hsvMat;
            }
            case "rgb2lab": {
                Mat labMat = new Mat();
                Imgproc.cvtColor(mat, labMat, Imgproc.COLOR_RGB2Lab);
                return labMat;
            }
            default:
                return mat;
        }
    }
}


http://www.kler.cn/a/567382.html

相关文章:

  • 基于机器学习的结构MRI分析:预测轻度认知障碍向阿尔茨海默病的转化
  • 易错点abc
  • 分享一套适合做课设的SpringBoot商城系统
  • Kotlin协变与逆变区别
  • yolov12 部署瑞芯微 rk3588、RKNN 部署工程难度小、模型推理速度快
  • 大模型应用案例 | 大模型+金融运维,擎创携手某证券创新运维能力新范式
  • Proser:新增CRC计算辅助功能
  • 从UNIX到Linux:操作系统进化史与开源革命
  • 加油站小程序实战05地图加载
  • 计算机毕业设计SpringBoot+Vue.js社团管理系统(源码+文档+PPT+讲解)
  • 如何在工控机上实现机器视觉检测?
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-loss.py
  • Kubernetes (K8S) 高效使用技巧与实践指南
  • MySQL 主从同步配置及操作步骤
  • 20250226-代码笔记05-class CVRP_Decoder
  • (十 四)趣学设计模式 之 策略模式!
  • 蓝桥杯试题:二分查找数组元素
  • Leetcode-最大矩形(单调栈)
  • 苹果与小米破冰合作:iPhone 16e全面支持Find My网络,跨生态互通实现技术性突破
  • springboot、deepseek4j、bge-m3和milvus