javacv从入门到精通——第四章:图像处理

  1. 学习如何使用javacv进行图像处理

主要内容包括

  1. 图像处理基础:介绍了图像的基本概念、像素的表示方法、图像的格式等基础知识。

  1. 图像读取和显示:通过javacv读取图像文件,并使用Java图形界面库Swing进行显示。

  1. 图像转换:介绍了如何将一种格式的图像转换为另一种格式,以及如何将图像进行缩放、裁剪、旋转等操作。

  1. 图像滤波:介绍了图像平滑、边缘检测、锐化等滤波操作的原理和实现方法。

  1. 图像特征提取:介绍了常用的图像特征提取方法,如颜色直方图、HOG特征等。

  1. 图像识别:介绍了如何使用机器学习算法进行图像识别,如SVM分类器、KNN分类器等。

以上内容均可以通过javacv的相关类和方法进行实现。需要注意的是,在进行图像处理时,由于图像数据量较大,需要考虑内存使用和计算效率等问题。

以下是使用Java代码示例进行图像处理的示例:

  1. 图像缩放

import org.bytedeco.opencv.opencv_core.*;
import org.bytedeco.opencv.global.opencv_imgcodecs;
import org.bytedeco.opencv.global.opencv_imgproc;

public class ImageResizer {
    public static void main(String[] args) {
        String imagePath = "input.jpg";
        Mat image = opencv_imgcodecs.imread(imagePath);
        Mat resizedImage = new Mat();
        Size size = new Size(500, 500);
        opencv_imgproc.resize(image, resizedImage, size);
        opencv_imgcodecs.imwrite("resized.jpg", resizedImage);
    }
}
  1. 图像旋转

import org.bytedeco.opencv.opencv_core.*;
import org.bytedeco.opencv.global.opencv_imgcodecs;
import org.bytedeco.opencv.global.opencv_imgproc;

public class ImageRotator {
    public static void main(String[] args) {
        String imagePath = "input.jpg";
        Mat image = opencv_imgcodecs.imread(imagePath);
        Mat rotatedImage = new Mat();
        double angle = 45.0;
        Point center = new Point(image.cols() / 2, image.rows() / 2);
        Mat rotationMatrix = opencv_imgproc.getRotationMatrix2D(center, angle, 1.0);
        opencv_imgproc.warpAffine(image, rotatedImage, rotationMatrix, image.size());
        opencv_imgcodecs.imwrite("rotated.jpg", rotatedImage);
    }
}
  1. 边缘检测

import org.bytedeco.opencv.opencv_core.*;
import org.bytedeco.opencv.global.opencv_imgcodecs;
import org.bytedeco.opencv.global.opencv_imgproc;

public class EdgeDetector {
    public static void main(String[] args) {
        String imagePath = "input.jpg";
        Mat image = opencv_imgcodecs.imread(imagePath);
        Mat grayImage = new Mat();
        Mat cannyImage = new Mat();
        opencv_imgproc.cvtColor(image, grayImage, opencv_imgproc.COLOR_BGR2GRAY);
        opencv_imgproc.Canny(grayImage, cannyImage, 100, 200);
        opencv_imgcodecs.imwrite("edges.jpg", cannyImage);
    }
}
  1. 图像腐蚀

import org.bytedeco.opencv.opencv_core.*;
import org.bytedeco.opencv.global.opencv_imgcodecs;
import org.bytedeco.opencv.global.opencv_imgproc;

public class ImageEroder {
    public static void main(String[] args) {
        String imagePath = "input.jpg";
        Mat image = opencv_imgcodecs.imread(imagePath);
        Mat erodedImage = new Mat();
        Mat element = opencv_imgproc.getStructuringElement(opencv_imgproc.MORPH_RECT, new Size(5, 5));
        opencv_imgproc.erode(image, erodedImage, element);
        opencv_imgcodecs.imwrite("eroded.jpg", erodedImage);
    }
}
  1. 图像膨胀

import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_imgcodecs;
import org.bytedeco.javacpp.opencv_imgproc;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.OpenCVFrameConverter;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImageDilateExample {
    public static void main(String[] args) {
        try {
            // 加载图像
            BufferedImage img = ImageIO.read(new File("input.png"));
            Java2DFrameConverter java2DFrameConverter = new Java2DFrameConverter();
            opencv_core.Mat inputMat = new OpenCVFrameConverter.ToMat().convert(java2DFrameConverter.convert(img));

            // 定义核
            opencv_core.Mat kernel = opencv_imgproc.getStructuringElement(opencv_imgproc.MORPH_RECT, new opencv_core.Size(3, 3));

            // 膨胀操作
            opencv_core.Mat outputMat = new opencv_core.Mat();
            opencv_imgproc.dilate(inputMat, outputMat, kernel);

            // 保存图像
            Java2DFrameConverter java2DFrameConverterOutput = new Java2DFrameConverter();
            BufferedImage outputImg = java2DFrameConverterOutput.convert(new OpenCVFrameConverter.ToMat().convert(outputMat));
            ImageIO.write(outputImg, "png", new File("output.png"));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  1. 学习如何进行图像的裁剪、缩放、旋转、翻转等操作

在javacv中,可以使用OpenCV中的函数来实现图像的裁剪、缩放、旋转、翻转等操作。以下是一些常用的函数和示例:

  1. 裁剪图像

使用cv::Rectcv::Mat可以裁剪图像。cv::Rect定义了矩形的左上角坐标和宽高,cv::Mat则表示图像。

import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_core.Rect;

// 读取图像
Mat src = imread("input.png");

// 定义矩形区域
Rect roi = new Rect(10, 10, 100, 100);

// 裁剪图像
Mat cropped = new Mat(src, roi);

// 保存图像
imwrite("output.png", cropped);
  1. 缩放图像

使用cv::resize函数可以缩放图像。该函数需要传入原始图像、目标图像和缩放比例。

import static org.bytedeco.opencv.global.opencv_imgcodecs.*;
import static org.bytedeco.opencv.global.opencv_imgproc.*;
import org.bytedeco.opencv.opencv_core.Mat;

// 读取图像
Mat src = imread("input.png");

// 缩放图像
Mat dst = new Mat();
resize(src, dst, new Size(0, 0), 0.5, 0.5);

// 保存图像
imwrite("output.png", dst);
  1. 旋转图像

使用cv::warpAffine函数可以旋转图像。该函数需要传入原始图像、目标图像、旋转矩阵和目标图像大小。

import static org.bytedeco.opencv.global.opencv_core.*;
import static org.bytedeco.opencv.global.opencv_imgcodecs.*;
import static org.bytedeco.opencv.global.opencv_imgproc.*;
import org.bytedeco.opencv.opencv_core.Mat;

// 读取图像
Mat src = imread("input.png");

// 定义旋转角度
double angle = 45;

// 计算旋转矩阵
Mat rot = getRotationMatrix2D(new Point2f(src.cols() / 2, src.rows() / 2), angle, 1);

// 旋转图像
Mat dst = new Mat();
warpAffine(src, dst, rot, new Size(src.cols(), src.rows()));

// 保存图像
imwrite("output.png", dst);
  1. 翻转图像

使用cv::flip函数可以翻转图像。该函数需要传入原始图像和翻转方式。

import static org.bytedeco.opencv.global.opencv_core.*;
import static org.bytedeco.opencv.global.opencv_imgcodecs.*;
import static org.bytedeco.opencv.global.opencv_imgproc.*;
import org.bytedeco.opencv.opencv_core.Mat;

// 读取图像
Mat src = imread("input.png");

// 翻转图像
Mat dst = new Mat();
flip(src, dst, 1);

// 保存图像
imwrite("output.png", dst);

  1. 学习如何添加水印和文字

在JavaCV中添加水印和文字可以通过调用OpenCV的API实现。下面是一些常见的添加水印和文字的操作:

  1. 在图像上添加水印

// 读取原始图像
Mat image = imread("input.png");

// 读取水印图像
Mat watermark = imread("watermark.png");

// 设置水印图像的透明度
double alpha = 0.5;

// 将水印图像复制到原始图像上
Mat image_with_watermark = image.clone();
addWeighted(image, 1-alpha, watermark, alpha, 0, image_with_watermark);

// 保存带有水印的图像
imwrite("output.png", image_with_watermark);
  1. 在图像上添加文字

// 读取原始图像
Mat image = imread("input.png");

// 设置字体类型和大小
int fontFace = FONT_HERSHEY_SIMPLEX;
double fontScale = 1;
int thickness = 2;

// 设置文字内容和位置
String text = "Hello, World!";
Point textOrg = new Point(50, 50);

// 在图像上添加文字
putText(image, text, textOrg, fontFace, fontScale, new Scalar(255, 255, 255), thickness);

// 保存带有文字的图像
imwrite("output.png", image);

  1. 学习如何进行图像特效处理

在 javacv 中进行图像特效处理通常需要先进行图像处理,然后再应用特定的效果,常见的图像特效处理包括边缘检测、模糊、锐化、颜色调整等。

下面是一些常见的图像特效处理示例:

  1. 边缘检测:

边缘检测可以通过使用不同的算子来实现。在 javacv 中可以使用 Sobel、Scharr、Laplacian 等算子进行边缘检测,示例代码如下:

Mat src = imread("input.jpg", IMREAD_GRAYSCALE);

Mat dst = new Mat();
Mat sobelX = new Mat();
Mat sobelY = new Mat();
Mat absSobelX = new Mat();
Mat absSobelY = new Mat();

Sobel(src, sobelX, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);
Sobel(src, sobelY, CV_16S, 0, 1, 3, 1, 0, BORDER_DEFAULT);

convertScaleAbs(sobelX, absSobelX);
convertScaleAbs(sobelY, absSobelY);

addWeighted(absSobelX, 0.5, absSobelY, 0.5, 0, dst);

imwrite("output.jpg", dst);
  1. 模糊:

模糊可以通过使用不同的滤波器来实现。在 javacv 中可以使用 GaussianBlur、blur、medianBlur 等滤波器进行模糊处理,示例代码如下:

Mat src = imread("input.jpg");

Mat dst = new Mat();

GaussianBlur(src, dst, new Size(5, 5), 0, 0, BORDER_DEFAULT);

imwrite("output.jpg", dst);
  1. 锐化:

锐化可以通过增加图像的对比度来实现。在 javacv 中可以使用 addWeighted 函数进行锐化处理,示例代码如下:

Mat src = imread("input.jpg");

Mat dst = new Mat();
Mat sharpen = new Mat();

GaussianBlur(src, sharpen, new Size(0, 0), 3);
addWeighted(src, 1.5, sharpen, -0.5, 0, dst);

imwrite("output.jpg", dst);
  1. 颜色调整:

颜色调整可以通过调整图像的亮度、对比度、色相、饱和度等参数来实现。在 javacv 中可以使用 convertTo、cvtColor 等函数进行颜色调整处理,示例代码如下:

Mat src = imread("input.jpg");

Mat dst = new Mat();

src.convertTo(dst, -1, 2, 0); // 增加亮度
cvtColor(dst, dst, COLOR_BGR2HSV); // 转换为 HSV 颜色空间
Scalar lower = new Scalar(20, 100, 100);
Scalar upper = new Scalar(30, 255, 255);
inRange(dst, lower, upper, dst); // 筛选出指定颜色的区域
cvtColor(dst, dst, COLOR_GRAY2BGR); //转换为 BGR 颜色空间

猜你喜欢

转载自blog.csdn.net/ayou_llf/article/details/129222628