🌈write in front🌈
🧸大家好,我是N阶二进制.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流.
🆔本文由N阶二进制原创 优快云首发🐒 如需转载还请通知⚠️
📝个人主页:N阶二进制🧸—优快云博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:N阶二进制🧸的openssl学习系列专栏——优快云博客
OpenCV支持保存多种图像格式,包括但不限于:JPEG、PNG、TIFF、BMP、PPM、PGM、PNM、Sun Raster、Radiance HDR、OpenEXR 等。以下是一些常见格式的保存方法示例:
一、不同图像格式位数说明
- 16位无符号
图像可保存成PNG、JPEG、TIFF格式文件 - 32位付点(CV_32F)
图像可以保存成PFM、TIFF、OpenEXR和Radiance HDR格式文件 - 4通道(alpha通道)
图像可以保存成PNG格式文件。
二、cv::imwirte函数说明
cv::imwrite()
函数是OpenCV中用于将图像保存为文件的函数。它的函数签名如下:
bool cv::imwrite(const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
filename
:保存文件的路径和名称。img
:要保存的图像,可以是cv::Mat
对象或其他支持的图像数据结构。params
:可选参数,用于指定保存图像的格式和压缩选项。这是一个整数向量,具体的参数值依赖于保存的图像格式。例如,在保存JPEG图像时,可以使用参数params
来指定图像的压缩质量。
cv::imwrite()
函数提供了许多参数来控制图像的保存方式。以下是一些常用参数的说明,以及它们的默认值(如果有的话):
参数 | 说明 | 默认值 |
---|---|---|
cv::IMWRITE_JPEG_QUALITY | JPEG图像的压缩质量(0-100之间的整数,值越大质量越好) | 95 |
cv::IMWRITE_JPEG_PROGRESSIVE | JPEG图像是否保存为渐进式模式(0表示不使用,1表示使用) | 0 |
cv::IMWRITE_JPEG_OPTIMIZE | JPEG图像是否进行优化(0表示不使用,1表示使用) | 0 |
cv::IMWRITE_JPEG_LUMA_QUALITY | JPEG图像的亮度通道压缩质量(0-100之间的整数,值越大质量越好) | 0 |
cv::IMWRITE_JPEG_CHROMA_QUALITY | JPEG图像的色度通道压缩质量(0-100之间的整数,值越大质量越好) | 0 |
cv::IMWRITE_WEBP_QUALITY | WebP图像的压缩质量(0-100之间的整数,值越大质量越好) | 1 |
cv::IMWRITE_PNG_COMPRESSION | PNG图像的压缩级别(0-9之间的整数,值越大压缩越多) | 3 |
cv::IMWRITE_TIFF_COMPRESSION | TIFF图像的压缩类型(-1表示自动选择,0表示无压缩,1表示LZW压缩,2表示PackBits压缩,3表示Deflate压缩) | -1 |
请注意,具体的参数值和默认值可能因OpenCV版本和编译配置而有所不同。建议查阅你使用的OpenCV版本的文档以获取最准确的信息。
以下是一个保存图像为JPEG格式的示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::Mat image = cv::imread("example.jpg");
// 检查图像是否成功读取
if (image.empty()) {
std::cerr << "Could not open or find the image!" << std::endl;
return -1;
}
// 保存为JPEG格式,指定压缩质量为90(可选参数)
std::vector<int> compression_params;
compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);
compression_params.push_back(90);
bool result = cv::imwrite("output.jpg", image, compression_params);
if (result) {
std::cout << "Image saved successfully!" << std::endl;
} else {
std::cerr << "Failed to save the image!" << std::endl;
}
return 0;
}
在这个示例中,图像被保存为JPEG格式,并且使用 IMWRITE_JPEG_QUALITY
参数指定了压缩质量为90。imwrite()
函数返回一个布尔值,表示保存是否成功。在实际应用中,你可以根据需要选择不同的参数来保存不同格式的图像。
三、opencv保存图片实例
1. 保存为JPEG格式
JPEG(Joint Photographic Experts Group)是一种广泛使用的图像压缩标准,它可以有效地压缩图像文件的大小,同时保持相对较高的图像质量。JPEG 图像通常使用 .jpg
或 .jpeg
扩展名。
以下是 JPEG 图像的一些特点和信息:
-
压缩算法: JPEG 使用一种有损压缩算法,通过去除图像中的一些细节和颜色信息来降低文件大小。这种压缩算法使得 JPEG 适用于存储和传输照片等图像。
-
颜色深度: JPEG 支持真彩色图像,即每个像素的颜色由红色、绿色和蓝色三个通道组成。每个通道通常使用 8 位表示,所以 JPEG 支持每个通道 256 种颜色,总共可以表示 16.7 万种颜色。
-
有损压缩: JPEG 是一种有损压缩格式,这意味着压缩后的图像质量相对较高,但不如无损压缩格式(例如 BMP 或 PNG)保真。在高度压缩的情况下,JPEG 图像可能出现压缩伪影(压缩造成的图像损失)。
-
适用场景: JPEG 格式适用于照片、图像和其他真实场景的图形,其中图像质量相对较高,而文件大小相对较小的需求。JPEG 不适合保存文本或者对图像质量要求非常高的场合,因为它是有损压缩的。
在使用 JPEG 图像时,可以根据需要进行不同程度的压缩。通常,压缩比越高,图像文件的大小就越小,但图像质量也会相应降低。选择适当的压缩比可以在图像质量和文件大小之间取得平衡。
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image = cv::imread("example.jpg");
// 检查图像是否成功读取
if (image.empty()) {
std::cerr << "Could not open or find the image!" << std::endl;
return -1;
}
// 保存为JPEG格式
cv::imwrite("output.jpg", image);
return 0;
}
2. 保存为PNG格式
PNG(Portable Network Graphics)是一种无损压缩的位图图像格式,广泛用于存储图像,并且支持透明度。PNG 图像通常使用 .png
扩展名。
以下是 PNG 图像的一些特点和信息:
-
无损压缩: PNG 使用无损压缩算法,这意味着在保存图像时不会损失图像质量。与JPEG不同,PNG 格式不会引入压缩伪影,因此图像可以保持原始质量。
-
支持透明度: PNG 支持透明度(alpha 通道),允许图像中的某些部分是透明的。这种特性使得 PNG 图像适用于需要透明背景的图像,比如图标和标志。
-
颜色深度: PNG 支持多种颜色深度,包括索引颜色(1-8位)、灰度(8位或16位),以及真彩色(24位或32位,包括透明度通道)。这种灵活性使得 PNG 适用于不同类型的图像。
-
无损压缩和无版权: PNG 是一种开放的、无版权的图像格式。它的无损压缩特性和对透明度的支持使得它在网络图形和图像处理中非常流行。
-
适用场景: PNG 格式适用于需要保留图像质量、支持透明度、以及无版权限制的图像。它常常用于网页图像、图标、图形设计等领域。
请注意,PNG 图像的文件大小通常比同样质量的 JPEG 图像大,因为它是无损压缩的。在选择图像格式时,可以根据图像的特性和用途来决定使用 JPEG 还是 PNG。
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image = cv::imread("example.jpg");
// 检查图像是否成功读取
if (image.empty()) {
std::cerr << "Could not open or find the image!" << std::endl;
return -1;
}
// 保存为PNG格式
cv::imwrite("output.png", image);
return 0;
}
3. 保存为TIFF格式
TIFF(Tagged Image File Format)是一种灵活的、多层次的、支持多种数据格式的位图图像格式。它是一种无损压缩的图像格式,最初由Adobe和Aldus公司开发,现在由Adobe Systems管理。TIFF 图像通常使用 .tiff
或 .tif
扩展名。
以下是 TIFF 图像的一些特点和信息:
-
无损压缩: TIFF 是一种无损压缩格式,它允许用户保存图像时不会丢失图像质量。因此,TIFF 图像适合于需要高质量图像的应用场景。
-
支持多层次和多种数据格式: TIFF 支持多层次(layers)和多种数据格式,包括单色、灰度、索引颜色、真彩色等。这种灵活性使得 TIFF 成为处理复杂图像数据的理想选择。
-
支持透明度: TIFF 格式可以包含透明度信息,允许图像中的某些部分是透明的,这样可以实现图像叠加和混合等效果。
-
支持多页: TIFF 格式支持多页文档,一个 TIFF 文件可以包含多个图像页面,这种特性使得它适合于文档扫描和图像处理应用。
-
支持压缩: TIFF 文件可以选择使用各种压缩算法,包括无压缩、LZW(Lempel-Ziv-Welch)压缩、JPEG 压缩等。这种灵活性使得 TIFF 图像可以根据需要选择合适的压缩方式。
-
适用场景: TIFF 格式适用于需要高质量图像、支持透明度、多层次、多种数据格式和多页文档的场合,例如印刷、出版、医学图像、地图制作等领域。
需要注意的是,由于 TIFF 文件格式的复杂性,不同的 TIFF 文件可能使用不同的压缩方式和数据格式。在选择 TIFF 格式时,可以根据具体应用需求来选择合适的配置选项。
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image = cv::imread("example.jpg");
// 检查图像是否成功读取
if (image.empty()) {
std::cerr << "Could not open or find the image!" << std::endl;
return -1;
}
// 保存为TIFF格式
cv::imwrite("output.tiff", image);
return 0;
}
4. 保存为BMP格式
BMP(Bitmap)是一种无压缩的位图图像格式,它以像素为基本单位,将图像数据存储为颜色索引和颜色表。BMP 图像通常使用 .bmp
扩展名。
以下是 BMP 图像的一些特点和信息:
-
无压缩: BMP 是一种无压缩格式,它将图像的每个像素的颜色信息直接存储在文件中。由于无压缩,BMP 文件通常较大,尤其是对于高分辨率和真彩色图像。
-
支持多种颜色深度: BMP 格式支持多种颜色深度,包括单色(1位,黑白图像)、索引颜色(通常是8位,最多256种颜色)、16位真彩色(每通道5位颜色,加1位透明度)和24位真彩色(每通道8位颜色,没有透明度通道)等。
-
支持透明度: 通常,BMP 格式不支持透明度通道,但是 Windows 系统中的 32 位 BMP(也称作 BMP32)格式支持带有透明度信息的图像。
-
简单结构: BMP 文件的结构相对简单,它包含了文件头、信息头、调色板(对于索引颜色图像)、像素数据等基本部分。
-
适用场景: 由于 BMP 是无压缩格式,图像质量较高,适用于需要保留高质量图像的场合。在一些特殊应用中,BMP 也被用作位图贴图或纹理贴图的格式。
需要注意的是,由于 BMP 文件没有压缩,它的文件大小相对较大。在网络传输或者存储空间有限的情况下,可以考虑使用其他压缩格式,如 JPEG 或 PNG,以减小文件大小。
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image = cv::imread("example.jpg");
// 检查图像是否成功读取
if (image.empty()) {
std::cerr << "Could not open or find the image!" << std::endl;
return -1;
}
// 保存为BMP格式
cv::imwrite("output.bmp", image);
return 0;
}
你可以使用 cv::imwrite()
函数将图像保存为不同的格式。只需选择适当的文件扩展名(例如 “.jpg”、“.png”、“.tiff”、“.bmp” 等),OpenCV 将会根据文件扩展名来选择合适的保存方法。请确保你的程序有写入文件的权限,并且保存路径是合法的。