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

这篇具有很好参考价值的文章主要介绍了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 等函数进行颜色调整处理,示例代码如下:文章来源地址https://www.toymoban.com/news/detail-492542.html

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 颜色空间

到了这里,关于javacv从入门到精通——第四章:图像处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ROS高效进阶第四章 -- 机器视觉处理之图像格式,usb_cam,摄像头标定,opencv和cv_bridge引入

    从本文开始,我们用四篇文章学习ROS机器视觉处理,本文先学习一些外围的知识,为后面的人脸识别,目标跟踪和yolov5目标检测做准备。 我的笔记本是Thinkpad T14 i7 + Nvidia MX450,系统是ubuntu20.04,ros是noetic。由于很多驱动与硬件强相关,请读者注意这点。 本文的参考资料有:

    2024年02月04日
    浏览(45)
  • 第四章-图像加密与解密

    使用异或运算实现图像加密及解密功能。 异或运算规则(相同为0,不同为1) 运算数相同,结果为0;运算数不同,结果为1 任何数(0/1)与0异或,结果仍为自身 任何数(0/1)与1异或,结果为另外一个数,即0变1, 1变0 任何数和自身异或,结果为0 同理到图像加密解密 加密过程:明文a与密钥b进行异

    2023年04月20日
    浏览(39)
  • KALI入门到高级【第四章】

    第一章 入门 1.1 什么是Kali Linux? 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 特权升级 1.5 远程访问 1.6 数据包嗅探和欺骗

    2024年02月02日
    浏览(30)
  • 第四章:前端框架Vue基础入门

    本章学习目标: 了解Vue框架架构思想 掌握Vue核心指令 掌握计算属性与监视 掌握组件化开发模式 官方文档:https://cn.vuejs.org/guide/introduction.html. 文档可选择使用optionsAPI(选项式API)阅读,或者CompositionApi(组合式API)阅读。选项式API更适合平滑从vue2过渡,以下示例均以Compositi

    2024年02月12日
    浏览(45)
  • 【UnityShader入门精要学习笔记】第四章(5)坐标空间

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (该系列笔记中大多数都会复习前文的知识,特别是前文知识非

    2024年01月21日
    浏览(48)
  • 【UnityShader入门精要学习笔记】第四章(3)矩阵的性质

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (该系列笔记中大多数都会复习前文的知识,特别是前文知识非

    2024年02月02日
    浏览(43)
  • 【UnityShader入门精要学习笔记】第四章(2)点和向量

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (该系列笔记中大多数都会复习前文的知识,特别是前文知识非

    2024年01月17日
    浏览(68)
  • 【UnityShader入门精要学习笔记】第四章(1)坐标系

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (该系列笔记中大多数都会复习前文的知识,特别是前文知识非

    2024年01月20日
    浏览(42)
  • 【UnityShader入门精要学习笔记】第四章(4)矩阵的几何意义

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (该系列笔记中大多数都会复习前文的知识,特别是前文知识非

    2024年02月01日
    浏览(45)
  • 【UnityShader入门精要学习笔记】第四章(6)法线变换、内置变量以及本章答疑

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (该系列笔记中大多数都会复习前文的知识,特别是前文知识非

    2024年01月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包