一、图像的拼接
//水平拼接
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);
//显示子矩阵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这个参数。
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);
}
}
原图:
掩膜:
掩膜后图像: