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);}
}
原图:
掩膜:
掩膜后图像: