分割图像,提取图像的RGB三原色(Core.split)
一个普通的彩色图像的每个像素点是由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);
}
/**
* -Djava.library.path=D:/Apps/MyTool/opencv/build/java/x64
* @param args
* @throws Exception
*/ 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));
}
}
图像放大缩小,修改图像大小(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);
}
}
效果:
图像裁剪(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;
/**
* 图像裁剪(Trimming Rect)
*/public class OpenCVTrimmingRect {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
/**
* -Djava.library.path=D:/Apps/MyTool/opencv/build/java/x64
*
* @param args
*/ 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);
}
}
效果