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);
    }
}

原图:

掩膜:

掩膜后图像:

相关推荐
研梦非凡4 小时前
CVPR 2025|基于视觉语言模型的零样本3D视觉定位
人工智能·深度学习·计算机视觉·3d·ai·语言模型·自然语言处理
Monkey的自我迭代4 小时前
多目标轮廓匹配
人工智能·opencv·计算机视觉
每日新鲜事4 小时前
Saucony索康尼推出全新 WOOOLLY 运动生活羊毛系列 生动无理由,从专业跑步延展运动生活的每一刻
大数据·人工智能
空白到白4 小时前
机器学习-聚类
人工智能·算法·机器学习·聚类
中新赛克5 小时前
双引擎驱动!中新赛克AI安全方案入选网安创新大赛优胜榜单
人工智能·安全
飞哥数智坊5 小时前
解决AI幻觉,只能死磕模型?OpenAI给出不一样的思路
人工智能·openai
聚客AI5 小时前
🌈多感官AI革命:解密多模态对齐与融合的底层逻辑
人工智能·llm·掘金·日新计划
zzywxc7875 小时前
AI在金融、医疗、教育、制造业等领域的落地案例
人工智能·机器学习·金融·prompt·流程图
zstar-_5 小时前
【论文阅读】REFRAG:一个提升RAG解码效率的新思路
人工智能
慧一居士6 小时前
SpringBoot改造MCP服务器(StreamableHTTP)
人工智能