Open CV 图像处理基础:(七)学习 OpenCV 的图像增强和边缘检测功能

发布时间:2024年01月15日

在Java中学习使用 OpenCV 的图像增强和边缘检测功能

前言

OpenCV(开放源代码计算机视觉库)是一个广泛用于图像处理和计算机视觉任务的开源库。它提供了丰富的功能,包括图像增强和边缘检测等。在Java中使用OpenCV可以帮助我们对图像进行各种处理,并提取出图像的重要特征。

图像增强功能

图像增强是指通过各种方法和技术改进图像的质量和视觉效果。OpenCV 提供了一些常用的图像增强函数,下面介绍两个常用函数:

对比度调整(Core.addWeighted())

对比度调整是通过改变图像的亮度增益和对比度增益来改变图像的对比度和明暗程度。在 OpenCV 中,可以使用 Core.addWeighted() 函数来实现对比度调整。

函数原型:
void addWeighted(Mat src1, double alpha, Mat src2, double beta, double gamma, Mat dst)
参数说明:
  • src1:输入图像1。
  • alpha:输入图像1的权重。
  • src2:输入图像2。
  • beta:输入图像2的权重。
  • gamma:亮度增益(常数值)。
  • dst:输出图像。
代码:
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

public class ImageEnhancement {
    static {
        // 加载 OpenCV 的本地库
        System.load("D:/dll/x64/opencv_java440.dll");
    }
    public static void main(String[] args) {
        String old = "D:/to/image.jpg";
        String outPut = "D:/to/image_enhancement.jpg";
        // 读取图片
        Mat image = Imgcodecs.imread(old);
        
        // 创建与输入图像相同尺寸和通道数的空的 Mat 对象
        Mat emptyMat = Mat.zeros(image.size(), image.type());
        
        // 对比度调整
        Mat contrastImage = image.clone();
        Core.addWeighted(image, 1.5, emptyMat, 0, 0, contrastImage);

        // 保存修改后的图片
        Imgcodecs.imwrite(outPut, contrastImage);
    }
}

在上述代码中,我们先创建了一个与输入图像 image 相同尺寸和通道数的空的 Mat 对象 emptyMat,然后将其作为 Core.addWeighted() 函数的第三个参数传递。这样就保证了输入的两个图像具有相同的尺寸和通道数,避免了错误。

示例

在这里插入图片描述

直方图均衡化(Imgproc.equalizeHist())

直方图均衡化是一种通过重新分布图像像素值来增强图像对比度的方法。在 OpenCV 中,可以使用 Imgproc.equalizeHist() 函数来实现直方图均衡化。

函数原型:
void equalizeHist(Mat src, Mat dst)
参数说明:
  • src:输入图像。
  • dst:输出图像。
代码:
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class ImageEnhancement {
    static {
        // 加载 OpenCV 的本地库
        System.load("D:/dll/x64/opencv_java440.dll");
    }

    public static void main(String[] args) {
        String old = "D:/to/image.jpg";
        String outPut = "D:/to/image_equalizedImage.jpg";
        // 读取彩色图片
        Mat image = Imgcodecs.imread(old);

        // 将图像转换为灰度图像
        Mat grayImage = new Mat();
        Imgproc.cvtColor(image, grayImage, Imgproc.COLOR_BGR2GRAY);

        // 直方图均衡化
        Mat equalizedImage = new Mat();
        Imgproc.equalizeHist(grayImage, equalizedImage);

        // 保存修改后的图片
        Imgcodecs.imwrite(outPut, equalizedImage);
    }
}

在上述代码中,我们首先使用 Imgproc.cvtColor() 函数将彩色图像转换为灰度图像,然后再将转换后的灰度图像应用直方图均衡化。

示例

在这里插入图片描述

边缘检测功能

边缘检测是指在图像中寻找视觉边缘的过程。OpenCV 提供了多种边缘检测算法,下面介绍一个常用函数:

Canny 边缘检测(Imgproc.Canny())

Canny 边缘检测是一种经典的边缘检测算法,它能够找到图像中的强边缘。在 OpenCV 中,可以使用 Imgproc.Canny() 函数来实现 Canny 边缘检测。

函数原型:
void Canny(Mat image, Mat edges, double threshold1, double threshold2)
  • image:输入图像。
  • edges:输出的边缘图像。
  • threshold1:边缘检测的低阈值。
  • threshold2:边缘检测的高阈值。
代码:
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class EdgeDetection {
    static {
        // 加载 OpenCV 的本地库
        System.load("D:/dll/x64/opencv_java440.dll");
    }

    public static void main(String[] args) {
        String old = "D:/to/image.jpg";
        String outPut = "D:/to/image_edges.jpg";

        // 读取图像
        Mat image = Imgcodecs.imread(old, Imgcodecs.IMREAD_GRAYSCALE);

        // Canny 边缘检测
        Mat edges = new Mat();
        Imgproc.Canny(image, edges, 50, 150);

        // 保存修改后的图片
        Imgcodecs.imwrite(outPut, edges);

        HighGui.imshow("边缘检测", edges);
        HighGui.waitKey();
    }
}

在上述代码中,我们使用 Imgcodecs.imread() 函数读取图像,并创建一个空的 Mat 对象 edges 来保存边缘检测结果。然后,我们调用 Imgproc.Canny() 函数来应用 Canny 边缘检测,其中 50 和 150 是阈值参数,用于控制边缘检测的灵敏度。最后,用窗口展示边缘检测的结果。

示例

在这里插入图片描述

总结

在本教程中,我们学习了如何在Java中使用OpenCV库进行图像增强和边缘检测。我们了解了安装和配置OpenCV库的步骤,并学习了一些常用的图像增强技术,如调整亮度和对比度、直方图均衡化和锐化。我们还学习了两种常见的边缘检测算法:Canny边缘检测和Sobel边缘检测。

希望这个教程对你有所帮助,并能够启发你在Java中使用OpenCV进行图像处理的创造力。如果你有任何问题,请随时提问。祝你成功!

Open CV 专栏导航

文章来源:https://blog.csdn.net/qq_35606010/article/details/135557042
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。