OpenCV——图像基本操作(三)

图像基本操作

一、图像的拼接

java 复制代码
//水平拼接
void Core.hconcat(List<Mat> src, Mat dst)
  • src:输入矩阵或矩阵向量,所有的矩阵必须具有相同的行数和相同的深度
  • dst:输出矩阵,和src具有相同的行数和深度,列数等于src列数之和
java 复制代码
//垂直拼接
void Core.cvoncat(List<Mat> src, Mat dst)
  • src:输入矩阵或矩阵向量,所有的矩阵必须具有相同的行数和相同的深度
  • dst:输出矩阵,和src具有相同的行数和深度,行数等于src行数之和
java 复制代码
public class Concat {
    static {
        OpenCV.loadLocally(); // 自动下载并加载本地库
    }

    public static void main(String[] args) {
        //读取图像并克隆
        Mat src1 = Imgcodecs.imread("F:/IDEAworkspace/opencv/src/main/java/demo/church.png");
        Mat src2 = src1.clone();
        //hConcat函数需要的参数准备
        List<Mat> mat1 = new ArrayList<>();
        mat1.add(src1);
        mat1.add(src2);
        //水平拼接
        Mat dst = new Mat();
        Core.hconcat(mat1, dst);
        //显示
        HighGui.imshow("hconcat", dst);
        HighGui.waitKey(0);

        //读取图像并克隆
        Mat src3 = Imgcodecs.imread("F:/IDEAworkspace/opencv/src/main/java/demo/leaf.png");
        Mat src4 = src3.clone();
        //vConcat函数需要的参数准备
        List<Mat> mat2 = new ArrayList<>();
        mat2.add(src3);
        mat2.add(src4);
        //垂直拼接
        Mat dst2 = new Mat();
        Core.vconcat(mat2, dst2);
        HighGui.imshow("vconcat", dst2);
        HighGui.waitKey(0);

        System.exit(0);
    }
}

水平拼接:

垂直拼接:

二、子矩阵

有时原图非常大,而我们只对图像的一个区域感兴趣,此时可以通过子矩阵来处理。子矩阵是指矩阵的一个子区域,可以像矩阵一样进行处理,但是对子矩阵的任何修改都会同时影响原来的矩阵。

java 复制代码
Mat Mat.submat(int rowStart, int rowEnd, int colStart, int colEnd)
  • rowStart:子矩阵在原矩阵中的起始行
  • rowEnd:子矩阵在原矩阵中的终止行
  • colStart:子矩阵在原矩阵中的起始列
  • colEnd:子矩阵在原矩阵中的终止列
java 复制代码
Mat Mat.submat(Range rowRange, Range colRange)
  • rowRange:子矩阵行的范围
  • colRange:子矩阵列的范围
java 复制代码
Mat Mat.submat(Rect roi)
  • roi:子矩阵的矩形区域
java 复制代码
public class Submat {

    static {
        OpenCV.loadLocally(); // 自动下载并加载本地库
    }
    public static void main(String[] args) {
        //读取图像1并显示
        Mat src1 = Imgcodecs.imread("F:/IDEAworkspace/opencv/src/main/java/demo/butterfly.png");
        HighGui.imshow("src1", src1);
        HighGui.waitKey(0);
        //创建子矩阵并设置为蓝色
        Mat sub1 = src1.submat(380, 600, 350, 610);
        Scalar blue = new Scalar(255, 0, 0);
        sub1.setTo(blue);
        //显示子矩阵1
        HighGui.imshow("设置子矩阵后的图像1", src1);
        HighGui.waitKey(0);

        //读取图像2并显示
        Mat src2 = Imgcodecs.imread("F:/IDEAworkspace/opencv/src/main/java/demo/fish.png");
        HighGui.imshow("src2", src2);
        HighGui.waitKey(0);
        //设置子矩阵
        Rect roi = new Rect(400, 40, 260, 210);
        Mat sub2 = src2.submat(roi);
        //将子矩阵中RGB颜色改为原来的一半
        for (int i = 0; i < sub2.rows(); i++) {
            for (int j = 0; j < sub2.cols(); j++) {
                byte[] data = new byte[3];
                sub2.get(i, j, data);
                for (int n = 0; n < data.length; n++) {
                    data[n] = (byte)(data[n] / 2);
                }
                sub2.put(i, j, data);
            }
        }
        //显示子矩阵
        HighGui.imshow("子矩阵2", sub2);
        HighGui.waitKey(0);
        //显示设置子矩阵后的图像2
        HighGui.imshow("设置子矩阵后的图像2", src2);
        HighGui.waitKey(0);

        //读取图像3
        Mat src3 = Imgcodecs.imread("F:/IDEAworkspace/opencv/src/main/java/demo/fish.png");
        //创建子矩阵并设置为蓝色
        Mat sub3 = src3.submat(new Range(400, 600), new Range(450, 800));
        sub3.setTo(blue);
        //显示设置子矩阵后的图像3
        HighGui.imshow("设置子矩阵后的图像3", src3);
        HighGui.waitKey(0);

        //查看3个子矩阵信息
        System.out.println(sub1);
        System.out.println(sub2);
        System.out.println(sub3);
        System.exit(0);

    }
}

原图像1:

设置子矩阵后的图像1:

图像2:

子矩阵:

设置子矩阵后的图像2:

设置子矩阵后的图像3:

三、掩膜

掩膜是指用选定的图像、图形或物体对需要处理的图像进行遮挡来控制处理区域或处理过程。OpenCV中有不少函数支持掩膜操作,这些函数都有mask这个参数。

java 复制代码
public class Mask {

    static {
        OpenCV.loadLocally(); // 自动下载并加载本地库
    }
    public static void main(String[] args) {
        //读取图像并显示
        Mat src = Imgcodecs.imread("F:/IDEAworkspace/opencv/src/main/java/demo/fish.png");
        HighGui.imshow("src", src);
        HighGui.waitKey(0);
        //创建掩膜图像
        Mat mask;
        Scalar black = new Scalar(0, 0, 0);
        Scalar white = new Scalar(255, 255, 255);
        mask = new Mat(src.size(), src.type(), black);
        //定义掩膜区域(矩形区域,白色)
        Rect roi = new Rect(400, 400, 400, 200);
        Mat sub = mask.submat(roi);
        sub.setTo(white);
        //在屏幕上显示掩膜图像
        HighGui.imshow("mask", mask);
        HighGui.waitKey(0);
        //生成带有掩膜的图像并显示
        Mat dst = new Mat(src.size(), src.type(), black);
        src.copyTo(dst, mask);
        HighGui.imshow("dst", dst);
        HighGui.waitKey(0);
        System.exit(0);
    }
}

原图:

掩膜:

掩膜后图像:

相关推荐
chenquan20 分钟前
ArkFlow 流处理引擎 0.4.0-rc1 发布
人工智能·后端·github
Se7en25826 分钟前
使用 Higress AI 网关代理 vLLM 推理服务
人工智能
AI大模型技术社30 分钟前
PyTorch手撕CNN:可视化卷积过程+ResNet18训练代码详解
人工智能·神经网络
Listennnn2 小时前
Text2SQL、Text2API基础
数据库·人工智能
钒星物联网3 小时前
256bps!卫星物联网极低码率语音压缩算法V3.0发布!
人工智能·语音识别
Listennnn3 小时前
迁移学习基础
人工智能·迁移学习
Ven%3 小时前
语言模型进化论:从“健忘侦探”到“超级大脑”的破案之旅
人工智能·语言模型·自然语言处理
tryCbest3 小时前
MoneyPrinterTurbo根据关键词自动生成视频
人工智能·ai
飞凌嵌入式3 小时前
基于RK3588,飞凌教育品牌推出嵌入式人工智能实验箱EDU-AIoT ELF 2
linux·人工智能·嵌入式硬件·arm·nxp
hao_wujing8 小时前
深度学习网络入侵检测系统警报
人工智能·深度学习