当前位置: 首页 > web >正文

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

图像基本操作

  • 一、图像的拼接
  • 二、子矩阵
  • 三、掩膜

一、图像的拼接

//水平拼接
void Core.hconcat(List<Mat> src, Mat dst)
  • src:输入矩阵或矩阵向量,所有的矩阵必须具有相同的行数和相同的深度
  • dst:输出矩阵,和src具有相同的行数和深度,列数等于src列数之和
//垂直拼接
void Core.cvoncat(List<Mat> src, Mat dst)
  • src:输入矩阵或矩阵向量,所有的矩阵必须具有相同的行数和相同的深度
  • dst:输出矩阵,和src具有相同的行数和深度,行数等于src行数之和
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);}
}

水平拼接:
在这里插入图片描述

垂直拼接:
在这里插入图片描述

二、子矩阵

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

Mat Mat.submat(int rowStart, int rowEnd, int colStart, int colEnd)
  • rowStart:子矩阵在原矩阵中的起始行
  • rowEnd:子矩阵在原矩阵中的终止行
  • colStart:子矩阵在原矩阵中的起始列
  • colEnd:子矩阵在原矩阵中的终止列
Mat Mat.submat(Range rowRange, Range colRange)
  • rowRange:子矩阵行的范围
  • colRange:子矩阵列的范围
Mat Mat.submat(Rect roi)
  • roi:子矩阵的矩形区域
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);//显示子矩阵1HighGui.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);//显示设置子矩阵后的图像2HighGui.imshow("设置子矩阵后的图像2", src2);HighGui.waitKey(0);//读取图像3Mat 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);//显示设置子矩阵后的图像3HighGui.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这个参数。

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

原图:
在这里插入图片描述

掩膜:
在这里插入图片描述

掩膜后图像:

在这里插入图片描述

http://www.xdnf.cn/news/13880.html

相关文章:

  • 【开发常用命令】:docker常用命令
  • preload、preconnect、prefetch 的作用
  • day033-备份服务rsync
  • Pytorch中view函数详解和工程实战示例
  • docker compose的变量使用说明
  • 【完整源码+数据集+部署教程】太阳能板灰尘检测系统源码和数据集:改进yolo11-LVMB
  • 京津冀城市群13城市空间权重0-1矩阵
  • Rosetta 2介绍
  • 第三章支线七 ·路由边境 · 多页世界的穿梭之术
  • 【MicronTech】eMMC 部件编号解析
  • flutter 的lottie执行一次动画后关闭
  • Windows美化终端、安装wsl和docker
  • Python Day49
  • 一阶/二阶Nomoto模型(野本模型)为何“看不到”船速对回转角速度/角加速度的影响?
  • 智慧管廊数字化运维管理平台
  • 规则引擎rule-engine v1.0实现解释(一)-规则,执行,容器
  • Vue3中组件Ref打印Proxy(Object)与defineExpose的深度解析
  • navicat 有免费版了,navicat 官方免费版下载
  • vue2项目开发中遇到的小问题
  • Goland使用手册(1)
  • 【亲测有效】MybatisPlus中MetaObjectHandler自动填充字段失效
  • Tess4J:基于 Java 的 OCR 解决方案
  • php反序列化漏洞学习
  • 电脑PC端使用的备忘录记事软件推荐哪个
  • 【3】使用TRAE AI在已有框架中新增页面并实现切换的痛苦经历
  • boa 找不到动态库的解决办法:
  • 【零基础勇闯嵌入式岗】从单片机低功耗中获得的启发
  • 正则表达式入门
  • 【AIGC】Qwen3-Embedding:Embedding与Rerank模型新标杆
  • 【狂飙AGI】第2课:大模型方向市场分析