OpenCv(C++)学习笔记——图像的读取与保存
OpenCv学习笔记一——图像的读取与保存
图像的读取
在OpenCv中,我们使用cv::imread()来读取和加载图像,该函数形式如下:
cv::Mat cv::imread(const cv::String &filename, int flags = 1)
返回类型:Mat,如果读取图像失败则会返回一个空的矩阵对象(Mat::data==NULL)
参数filename:读取图像文件名,可以使用相对路径或者绝对路径,但是必须带有完整的文件名(包括图像格式后缀)
参数flag:一个读取标记,用于选择读取图像的方式,默认值为IMREAD_COLOR,flags值的设定与用什么颜色格式读取有关。
此外:imread()函数支持读取的图像格式有以下几种。
.bmp .dib .jpeg .jpg .jpe .jp2 .png
C++定义
|
说明
|
IMREAD_GRAYSCALE
|
返回灰色图像
|
IMREAD_COLOR
|
返回彩色图像BGR
|
IMREAD_ANYCOLOR
|
以任何可能的颜色格式读取图像
|
IMREAD_REDUCED_GRAYSCALE_N
|
将图像转换为灰度图像的1/N,N可以为2,4,8
|
IMREAD_REDUCED_COLOR_N
|
将图像转换为三通道彩色图像的1/N,N可以为2,4,8
|
IMREAD_IGNORE_ORIENTATION
|
将忽略任何EXIF信息的方向标志旋转图像
|
IMREAD_ANYDEPTH
|
以任何可能的深度读取图像
|
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(void)
{
//读取图像
Mat image=imread("D:\\360\\test.jpg",IMREAD_REDUCED_GRAYSCALE_4);//将D:\\360\\test.jpg改成你的图片的储存地址
if(image.data!=NULL)
{
//显示图像
imshow("niiubi",image);
waitKey(0);
}
else
{
cout<<"can't open the file!"<<endl;
getchar();
}
return 0;
}
图像的保存
C语言中,我们使用imwrite()函数来读取图像,该函数的定义如下:
bool cv::imwrite(const String & filename),InputArray img,const std::vector<int>¶ms=std::vector<int>());
const String & filename:需要保存的图像文件名——格式+扩展名
InputArray:要保存的图像
const std::vector < int > & params:表示为特定格式保存的参数编码。
需要注意的是:imwrite是基于文件拓展名选择格式的。通常,使用此功能只能保存8位单通道或者三通道(BGR)的图像,但有以下例外:
·对于PNG、JPEG2000和TIFF格式,可以保存16位无符号(CV_16U)图像。
·32位浮点(CV_32F)图像可以保存为PFM、TIFF、OpenEXR和Radiance HDR格式,可以使用LogLuv高动态编码(每像素四个字节)保存三通道(CV_32FC3)TIFF格式图像。
·可以使用此功能保存alpha通道的PNG格式图像。为此,创建8位(或者16位)四通道BGRA图像,其中alpha通道在最后。完全透明的像素应该将alpha通道的值设置为0,完全不透明的像素应该将alpha像素通道的值设置为255/65535
·Imwrite()函数中特定格式的编码参数及其含义表如表所示:
编码参数
|
含义
|
IMWRITE_JPEG_QUALITY
|
JPEG图像质量,其值可以是0~100,越大越好,默认95
|
IMWRITE_PNG_COMPRESSION
|
PNG图像的压缩级别,其值可以是0~9,值越大意味着越小的尺寸和越长的压缩时间。如果指定,则策略更改为IMWRITE_PNG_STRATEGY_DEFAULT(Z_DEFAULT_STRATEGY)
|
IMWRITE_JPEG_QUALITY Python:cv.IMWRITE_JPEG_QUALITY
|
对于JPEG,它可以是从0到100的质量(越高越好)。默认值为95。
|
IMWRITE_JPEG_PROGRESSIVE Python:cv.IMWRITE_JPEG_PROGRESSIVE
|
启用JPEG功能,0或1,默认为False。
|
IMWRITE_JPEG_OPTIMIZE Python:cv.IMWRITE_JPEG_OPTIMIZE
|
启用JPEG功能,0或1,默认为False。
|
IMWRITE_JPEG_RST_INTERVAL Python:cv.IMWRITE_JPEG_RST_INTERVAL
|
JPEG重启间隔,0 - 65535,默认为0 - 无重启。
|
IMWRITE_JPEG_LUMA_QUALITY Python:cv.IMWRITE_JPEG_LUMA_QUALITY
|
单独的亮度质量等级,0 - 100,默认为0 - 不使用。
|
IMWRITE_JPEG_CHROMA_QUALITY Python:cv.IMWRITE_JPEG_CHROMA_QUALITY
|
单独的色度质量等级,0 - 100,默认为0 - 不使用。
|
IMWRITE_PNG_COMPRESSION Python:cv.IMWRITE_PNG_COMPRESSION
|
对于PNG,它可以是从0到9的压缩级别。值越高意味着更小的尺寸和更长的压缩时间。如果指定,则策略更改为IMWRITE_PNG_STRATEGY_DEFAULT(Z_DEFAULT_STRATEGY)。默认值为1(最佳速度设置)。
|
IMWRITE_PNG_STRATEGY Python:cv.IMWRITE_PNG_STRATEGY
|
其中一个品种:: ImwritePNGFlags,默认为IMWRITE_PNG_STRATEGY_RLE。
|
IMWRITE_PNG_BILEVEL Python:cv.IMWRITE_PNG_BILEVEL
|
二进制级别PNG,0或1,默认为0。
|
IMWRITE_PXM_BINARY Python:cv.IMWRITE_PXM_BINARY
|
对于PPM,PGM或PBM,它可以是二进制格式标志,0或1.默认值为1。
|
IMWRITE_EXR_TYPE Python:cv.IMWRITE_EXR_TYPE
|
在OpenCV中,IMWRITE_EXR_TYPE参数可以用来指定EXR图像的压缩类型,其取值可以是以下之一:IMWRITE_EXR_TYPE_HALF:使用半精度浮点数进行压缩。IMWRITE_EXR_TYPE_FLOAT:使用单精度浮点数进行压缩。IMWRITE_EXR_TYPE_UINT:使用无符号整数进行压缩。
|
IMWRITE_WEBP_QUALITY Python:cv.IMWRITE_WEBP_QUALITY
|
覆盖EXR存储类型(默认为FLOAT(FP32))对于WEBP,它可以是1到100的质量(越高越好)。默认情况下(不带任何参数),如果质量高于100,则使用无损压缩。
|
IMWRITE_PAM_TUPLETYPE Python:cv.IMWRITE_PAM_TUPLETYPE
|
对于PAM,将TUPLETYPE字段设置为为格式定义的相应字符串值。
|
IMWRITE_TIFF_RESUNIT Python:cv.IMWRITE_TIFF_RESUNIT
|
对于TIFF,用于指定要设置的DPI分辨率单位; 请参阅libtiff文档以获取有效值。
|
IMWRITE_TIFF_XDPI Python:cv.IMWRITE_TIFF_XDPI
|
对于TIFF,用于指定X方向DPI。
|
IMWRITE_TIFF_YDPI Python:cv.IMWRITE_TIFF_YDPI
|
对于TIFF,用于指定Y方向DPI。
|
IMWRITE_TIFF_COMPRESSION Python:cv.IMWRITE_TIFF_COMPRESSION
|
对于TIFF,用于指定图像压缩方案。请参阅libtiff以获取与压缩格式对应的整数常量。注意,对于深度为CV_32F的图像,仅使用libtiff的SGILOG压缩方案。对于其他支持的深度,可以通过此标志指定压缩方案; LZW压缩是默认值。
|
IMWRITE_JPEG2000_COMPRESSION_X1000 Python:cv.IMWRITE_JPEG2000_COMPRESSION_X1000
|
对于JPEG2000,用于指定目标压缩率(乘以1000)。该值可以是0到1000.默认值是1000。
|
给各位一个忠告,这个压缩格式尊嘟太繁杂了,咱们不玩这些花的,记住几个重要的就行了,甚至咱们不记忆这个,到时候有问题直接面向CSDN编程即可。上面加粗的几个是常用格式,可以参考学习
示例代码如下:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(void)
{
Mat image=imread("D:\\360\\test.jpg",IMREAD_ANYDEPTH);
if(image.data!=NULL)
{ //显示图像
imshow("niiubi",image);
//不指定压缩格式直接保存
imwrite("D:\\360\\save.jpg",image);
waitKey(0);
//销毁所有窗口
//destroyAllWindows();
}
else
{
cout<<"can't open the file!"<<endl;
getchar();
}
return 0;
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/mimanchi99/article/details/132948036