一个普通得彩色图像得每个像素点是由RGB三种颜色构成得,那么这种图像就是3通道图像;多通道图像,单独得R色、G色和B色都分别称为一个单通道图像。
OpenCV中得Mat类型可以理解为一种多维多通道得矩阵,如果一个普通得彩色图像读进来后赋值给一个Mat类型得对象M,那么这个M就是一个二维数组,这个二维数组中得每个元素都是一个含有三个RGB值得数据,那这个M就是一个二维三通道得矩阵。
案例代码
package com.what21.opencv01.demo03;import java.util.List;import org.opencv.core.Core;import org.opencv.core.Mat;import org.opencv.imgcodecs.Imgcodecs;public class OpenCVSplitRGB { static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } public static void main(String[] args) throws Exception { Mat src = Imgcodecs.imread("D:/1.jpg"); // 提取图像得RGB三原色(Core.split) List<Mat> dst = new java.util.ArrayList<Mat>(3); Core.split(src, dst); Imgcodecs.imwrite("D:/1_b.jpg", dst.get(0)); Imgcodecs.imwrite("D:/1_g.jpg", dst.get(1)); Imgcodecs.imwrite("D:/1_r.jpg", dst.get(2)); }}
1.jpg
1_b.jpg
1_g.jpg
1_r.jpg
图像放大缩小,修改图像大小(Imgproc.resize)修改图像大小,就是改变矩阵得行数,通过插值得方式来改变图像得尺寸。
Imgproc.resize()方法参数:src:输入,原图像,即待改变大小得图像;dst:输出,改变大小之后得图像,这个图像和原图像具有相同得内容,只是大小和原图像不一样而已;dsize:输出图像得大小。如果这个参数不为0,那么就代表将原图像缩放到这个Size(width,height)指定得大小;如果这个参数为0。
案例代码
package com.what21.opencv01.demo03;import org.opencv.core.Core;import org.opencv.core.Mat;import org.opencv.core.Size;import org.opencv.imgcodecs.Imgcodecs;import org.opencv.imgproc.Imgproc;public class OpenCVResize { static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } public static void main(String[] args) { Mat src = Imgcodecs.imread("D:/1.jpg"); Mat dst = src.clone(); // 支持缩小 float scale = 0.5f; float width = src.width(); float height = src.height(); // 缩小 Imgproc.resize(src, dst, new Size(width * scale, height * scale)); Imgcodecs.imwrite("D:/1-1.jpg", dst); // 放大 scale = 1.5f; Imgproc.resize(src, dst, new Size(width * scale, height * scale)); Imgcodecs.imwrite("D:/1-2.jpg", dst); // 指定尺寸 Imgproc.resize(src, dst, new Size(400, 400)); Imgcodecs.imwrite("D:/1-3.jpg", dst); }}
效果:
1-1.jpg
1-2.jpg
1-3.jpg
图像裁剪(Trimming Rect)Rect矩阵类,成员变量x、y、width、height,分别为左上角点得坐标和矩形得宽和高。
常用得成员函数有:size(): 返回值为一个size;area(): 返回矩形得面积;contains(Point): 用来判断点是否在矩形内;inside(Rect): 函数判断矩形是否在该矩形内;tl(): 返回左上角点坐标;br(): 返回右下角点坐标;
案例代码
package com.what21.opencv01.demo03;import org.opencv.core.Core;import org.opencv.core.Mat;import org.opencv.core.Rect;import org.opencv.imgcodecs.Imgcodecs;public class OpenCVTrimmingRect { static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } public static void main(String[] args) { Mat src = Imgcodecs.imread("D:/1.jpg"); System.out.println("width:" + src.cols()); System.out.println("height:" + src.rows()); Rect roi = new Rect(0, 0, 500, 350); //指定图像格式大小 Mat dst = new Mat(src, roi); Imgcodecs.imwrite("D:/1_1.jpg", dst); }}
效果