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

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

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

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

掩膜后图像:

在这里插入图片描述

相关文章:

  • 数据库专家 OCP 认证培训:开启职业黄金赛道
  • 基于Springboot+UniApp+Ai实现模拟面试小工具一:系统需求分析及设计
  • TDengine 基础功能——数据写入
  • SpringCloud-seata集成到nacos
  • 6.12 操作系统面试题 进程管理
  • JDBC接口开发指南
  • 泛型的PECS原则
  • Docker 安装 Oracle 12C
  • React中修改 state 时必须返回一个新对象 (immutable update)
  • 基于数据库实现配置管理和定时任务启停
  • 常见Modbus协议面试问题
  • 强化微调技术与GRPO算法(1):简介
  • 农田实时监测与管理系统开发
  • map()函数
  • IteraJudge-增量多维评判框架解读
  • 第十节 高频代码题-类型推断题
  • NXP S32K146 T-Box 携手 SDNAND(贴片式 TF 卡):驱动汽车智能革新的黄金组合
  • 接口测试不再难:智能体自动生成 Postman 集合
  • 计算机系统(6)
  • 翻译核心词汇
  • 网站运营有前途吗/美国婚恋网站排名
  • 网站建设网站设计哪家专业/cpu游戏优化加速软件
  • 网站建设颜色注意事项/推广计划怎么做推广是什么
  • 做网站后有人抢注关键词/b站推广入口在哪
  • 敦化建设局网站/宁波最好的推广平台
  • 做网站费用会计科目/优化手机流畅度的软件