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

原图:

掩膜:

掩膜后图像:

相关推荐
葫三生43 分钟前
如何评价《论三生原理》在科技界的地位?
人工智能·算法·机器学习·数学建模·量子计算
m0_751336392 小时前
突破性进展:超短等离子体脉冲实现单电子量子干涉,为飞行量子比特奠定基础
人工智能·深度学习·量子计算·材料科学·光子器件·光子学·无线电电子
美狐美颜sdk5 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
DeepSeek-大模型系统教程5 小时前
推荐 7 个本周 yyds 的 GitHub 项目。
人工智能·ai·语言模型·大模型·github·ai大模型·大模型学习
郭庆汝5 小时前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
小雷FansUnion7 小时前
深入理解MCP架构:智能服务编排、上下文管理与动态路由实战
人工智能·架构·大模型·mcp
资讯分享周7 小时前
扣子空间PPT生产力升级:AI智能生成与多模态创作新时代
人工智能·powerpoint
叶子爱分享8 小时前
计算机视觉与图像处理的关系
图像处理·人工智能·计算机视觉
鱼摆摆拜拜8 小时前
第 3 章:神经网络如何学习
人工智能·神经网络·学习
一只鹿鹿鹿9 小时前
信息化项目验收,软件工程评审和检查表单
大数据·人工智能·后端·智慧城市·软件工程