1. org.opencv.imgcodecs
imgcodecs = image + codec,由名称可知,肯定与图像的编解码有关,opencv 通过该模块,对各种格式类型的图片进行解码,载入并创建 生成对应的 Mat 对象,或者,将程序中的 Mat 对象,输出为指定格式的图片文件。
2. Imgcodes 方法
方法 | 描述 |
---|---|
static boolean haveImageReader(java.lang.String filename) | 如果指定的图像可以由OpenCV解码,则返回true |
static boolean haveImageWriter(java.lang.String filename) | 如果 OpenCV 可以对具有指定文件名的图像进行编码,则返回true |
static Mat imdecode(Mat buf, int flags) | 从内存中的缓冲区读取图像。 |
static boolean imencode(java.lang.String ext, Mat img, MatOfByte buf) | 将图像编码到内存缓冲区。 |
static boolean imencode(java.lang.String ext, Mat img, MatOfByte buf, MatOfInt params) | |
static Mat imread(java.lang.String filename) | 从文件中加载图像 |
static Mat imread(java.lang.String filename, int flags) | |
static boolean imreadmulti(java.lang.String filename, java.util.List mats) | 加载多页图像 |
static boolean imreadmulti(java.lang.String filename, java.util.List mats, int flags) | |
static boolean imreadmulti(java.lang.String filename, java.util.List mats, int start, int count) | |
static boolean imreadmulti(java.lang.String filename, java.util.List mats, int start, int count, int flags) | |
static boolean imwrite(java.lang.String filename, Mat img) | 保存图像至文件 |
static boolean imwrite(java.lang.String filename, Mat img, MatOfInt params) | |
static boolean imwritemulti(java.lang.String filename, java.util.List img) | 保存多页图像 |
static boolean imwritemulti(java.lang.String filename, java.util.List img, MatOfInt params) |
3 图片读入
public void readTest(){
Mat img = Imgcodecs.imread("images/1.jpg", IMREAD_GRAYSCALE);
System.out.println(img.channels()); // 1
System.out.println(img.cols());
System.out.println(img.rows());
System.out.println(img.total());
System.out.println(img.depth());
System.out.println(img.height());
System.out.println(img.width());
}
读入的模式:
模式 | 说明 |
---|---|
IMREAD_UNCHANGED | 按原样返回加载的图像(使用alpha通道,否则会被裁剪)。 |
IMREAD_GRAYSCALE | 将图像转换为单通道灰度图像(编解码器内部转换)。 |
IMREAD_COLOR | 将图像转换为3通道BGR彩色图像。 |
IMREAD_ANYDEPTH | 当输入图像具有深度时,返回16位/32位图像,否则将其转换为8位。 |
IMREAD_ANYCOLOR | 图像以任何可能的颜色格式读取。 |
IMREAD_LOAD_GDAL | 使用gdal驱动程序加载图像。 |
IMREAD_REDUCED_GRAYSCALE_2 | 将图像转换为单通道灰度图像,图像大小缩小1/2。 |
IMREAD_REDUCED_COLOR_2 | 将图像转换为3通道BGR彩色图像,图像大小缩小1/2。 |
IMREAD_REDUCED_GRAYSCALE_4 | 将图像转换为单通道灰度图像,图像大小缩小1/4。 |
IMREAD_REDUCED_COLOR_4 | 始终将图像转换为3通道BGR彩色图像,图像大小缩小1/4。 |
IMREAD_REDUCED_GRAYSCALE_8 | 始终将图像转换为单通道灰度图像,图像大小减小1/8。 |
IMREAD_REDUCED_COLOR_8 | 将图像转换为3通道BGR彩色图像,图像大小缩小1/8。 |
IMREAD_IGNORE_ORIENTATION | 不要根据EXIF的方向标志旋转图像。 |
imread从指定文件加载图像并返回。如果无法读取图像(因为缺少文件、权限不正确、格式不受支持或无效),函数将返回一个空矩阵(Mat::data==NULL)。
目前,支持以下文件格式:
- Windows bitmaps - *.bmp, *.dib
- JPEG files - *.jpeg, *.jpg, *.jpe
- JPEG 2000 files - *.jp2
- Portable Network Graphics - *.png
- WebP - *.webp
- Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm
- PFM files - *.pfm
- Sun rasters - *.sr, *.ras
- TIFF files - *.tiff, *.tif
- OpenEXR Image files - *.exr
- Radiance HDR - *.hdr, *.pic
- Raster and Vector geospatial data supported by GDAL
注意事项:
- imread 函数是通过图片内容来识别图片的格式,而不是图片名的后缀;
- 在彩色图像的情况下,解码图像将以bgr顺序存储通道;
- 使用 IMREAD_GRAYSCALE 时,将使用编解码器的内部灰度转换功能。结果可能与 cvtColor() 的输出不同;
- 默认情况下,像素数必须小于2^30。可以使用系统变量OPENCV_IO_MAX_IMAGE_PIXELS设置限制;
4 图像输出
imwrite() 方法保存图像内容到文件中。根据文件扩展名选择图像格式。
通常,只能保存8位单通道或3通道(具有“BGR”通道顺序)图像:
- 16位无符号(CV_16U)图像可以保存为PNG、JPEG 2000和TIFF格式
- 32位浮点(CV_32F)图像可以以PFM、TIFF、OpenEXR和Radiance HDR格式保存;三通道(CV_32FC3)TIFF图像将使用LogLuv高动态范围编码(每像素4字节)保存;
- 可以保存带有alpha通道的PNG图像。为此,创建8位(或16位)4通道图像BGRA,其中alpha通道位于最后。完全透明像素的alpha值应设置为0,完全不透明像素的alpha值应设置为255/65535。
- 可以以TIFF格式保存多页图像(Mat向量)
如果是不支持的图像格式,图像将转换为8位无符号(CV_8U)并以这种方式保存。
如果格式、深度或通道顺序不同,请在保存前使用Mat::convertTo和cv::cvtColor进行转换。或者,使用通用文件存储I/O函数将图像保存为XML或YAML格式。
4.1 生成灰度图:
public void writeGrayTest(){
Mat mat = new Mat(480, 640, CV_8U);
for (int i = 0; i < mat.rows(); i++) {
for (int j = 0; j < mat.cols(); j++) {
mat.put(i, j, (i * j) % 200);
}
}
imwrite("gray.png", mat);
System.out.println("success");
}
4.2 生成3通道图片:
public void writeC3Test(){
Mat mat = new Mat(480, 640, CV_8UC3);
for (int i = 0; i < mat.rows(); i++) {
for (int j = 0; j < mat.cols(); j++) {
mat.put(i, j, (i * j) % 200, (i+j)%100,255-(i+j)%255);
}
}
imwrite("test.png", mat);
System.out.println("success");
}
4.3 生成 4 通道图片
public void writeC4Test(){
Mat mat = new Mat(480, 640, CV_8UC4);
for (int i = 0; i < mat.rows(); i++) {
for (int j = 0; j < mat.cols(); j++) {
mat.put(i, j, (i * j) % 200, (i+j)%100, 255-(i+j)%255, i%255);
}
}
imwrite("test.png", mat);
System.out.println("success");
}
4.4 支持图片压缩
public void writeCompressTest(){
Mat mat = new Mat(480, 640, CV_8UC4);
for (int i = 0; i < mat.rows(); i++) {
for (int j = 0; j < mat.cols(); j++) {
mat.put(i, j, (i * j) % 200, (i+j)%100,255-(i+j)%255, i%255);
}
}
MatOfInt params = new MatOfInt();
params.fromArray(IMWRITE_PNG_COMPRESSION, 9);
imwrite("compress.png", mat, params);
System.out.println("success");
}
- IMWRITE_PNG_COMPRESSION , 对于PNG,它可以是从0到9的压缩级别。值越大,表示尺寸越小,压缩时间越长。如果指定,策略将更改为IMWRITE_PNG_strategy_DEFAULT(Z_DEFAULT_策略)。默认值为1(最佳速度设置)。
未压缩图片大小:
压缩后生存的图片: