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 小时前
【C++基本功】C++适合做什么,哪些领域适合哪些领域不适合?
c语言·开发语言·c++·人工智能·团队开发
rit84324995 小时前
基于MATLAB实现基于距离的离群点检测算法
人工智能·算法·matlab
初学小刘6 小时前
深度学习:从图片数据到模型训练(十分类)
人工智能·深度学习
递归不收敛6 小时前
大语言模型(LLM)入门笔记:嵌入向量与位置信息
人工智能·笔记·语言模型
之墨_7 小时前
【大语言模型】—— 自注意力机制及其变体(交叉注意力、因果注意力、多头注意力)的代码实现
人工智能·语言模型·自然语言处理
从孑开始8 小时前
ManySpeech.MoonshineAsr 使用指南
人工智能·ai·c#·.net·私有化部署·语音识别·onnx·asr·moonshine
涛涛讲AI8 小时前
一段音频多段字幕,让音频能够流畅自然对应字幕 AI生成视频,扣子生成剪映视频草稿
人工智能·音视频·语音识别
可触的未来,发芽的智生8 小时前
新奇特:黑猫警长的纳米世界,忆阻器与神经网络的智慧
javascript·人工智能·python·神经网络·架构
WWZZ20258 小时前
快速上手大模型:机器学习2(一元线性回归、代价函数、梯度下降法)
人工智能·算法·机器学习·计算机视觉·机器人·大模型·slam
AKAMAI9 小时前
数据孤岛破局之战 :跨业务分析的难题攻坚
运维·人工智能·云计算