自己太小白了  这个纯属给自己看的

什么是图像深度
imwrite("D:/result.png ", dst);
  • 1.

这样保存的图像默认是每个通道8位的字节图像,常见的RGB图像是图像深度为24,这个可以通过windows下查看图像属性获得,截图如下:

OpenCV~图像深度_位图

如果每个通道占16位的话,RGB图像深度就会变成48,如果每个通道占32位的话,深度就会变成96,显然图像深度越大,图像文件也会越多,加载时候消耗的内存也会越多,所以OpenCV中默认读写图像都是每个通道8位(单字节)图像。

重温imwrite函数

假设我们想保存图像为16位或者32位浮点数图像时候,我们该怎么去做,在开始之前我们首先再次复习一下OpenCV中保存图像的API函数-imwrite

bool cv::imwrite(
   const String &  filename,
   InputArray img,
   const std::vector< int > &  params = std::vector< int >()
)
Filename 参数为声明的文件保存路径
Img参数表示的是将要保存的Mat图像对象
Params 表示的是保存图像时的选项,
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

这些选项包括PNG/JPG/WEBP/TIFF压缩质量、格式选择等,可以分为如下四个大类

  • ImwriteEXRTypeFlags
  • ImwriteFlags
  • ImwritePAMFlags
  • ImwritePNGFlags,

之前写过一篇文章是关于在保持时候如何使用这些选项对图像进行适当的压缩处理,这里关于Params参数使用方式就不再赘述,主要是基于key-value方式添加到vector中去即可。

imwrite函数在关于保存为不同深度格式时候的图像类型支持说明如下:

  • 8位的图像(CV_8U),支持png/jpg/bmp/webp等各种常见图像格式
  • 16位的图像(CV_16U),支持png/jpeg2000/TIFF格式
  • 32位的图像(CV_32F),支持PFM/TIFF/OpenEXR/TIFF/HDR

在要保存为指定格式之前,可以通过convertTo或者cvtCOLOR进行图像类型或者通道转换之后,再调用imwrite进行保存。

各种不同深度保存
16位图像保存

转换之后,如果直接保存,代码如下:

// 加载图像
Mat src = imread("D:/flower.png", IMREAD_UNCHANGED);
printf("depth %d \n", src.depth());

// 转为为16位图像
Mat dst;
src.convertTo(dst, CV_16U);
imshow("flower16", dst);
imwrite("D:/flower-16.png", dst);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

转换之后,归一化之后再保存,代码如下:

// 加载图像
Mat src = imread("D:/flower.png", IMREAD_UNCHANGED);
printf("depth %d \n", src.depth());

// 转为为16位图像
Mat dst;
src.convertTo(dst, CV_16U);

// 归一化再保存
normalize(dst, dst, 0, 256 * 256, NORM_MINMAX);
imwrite("D:/flower-16.png", dst);
imshow("flower-16", dst);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

两者效果对比如下:

OpenCV~图像深度_人工智能_02

32位图像保存
// 加载图像
Mat src = imread("D:/flower.png", IMREAD_UNCHANGED);
printf("depth %d \n", src.depth());

// 转为为32位图像
Mat dst;
src.convertTo(dst, CV_32F);

// 归一化再保存
normalize(dst, dst, 0, 1.0, NORM_MINMAX);
imwrite("D:/flower-32.png", dst);
imshow("flower-32", dst);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

对上述各种不同深度的图像,必须通过下面的方式才可以正确读取

Mat src = imread("D:/flower.png", IMREAD_UNCHANGED);
  • 1.

其中IMREAD_UNCHANGED表示不对原图像做任何改变。

最后发一些数据集哦

1.火焰和烟雾图像数据集

数据集链接:http://m6z.cn/6fzn0f

该数据集由早期火灾和烟雾的图像数据集组成。数据集由在真实场景中使用手机拍摄的早期火灾和烟雾图像组成。大约有7000张图像数据。图像是在各种照明条件(室内和室外场景)、天气等条件下拍摄的。该数据集非常适合早期火灾和烟雾探测。数据集可用于火灾和烟雾识别、检测、早期火灾和烟雾、异常检测等。数据集还包括典型的家庭场景,如垃圾焚烧、纸塑焚烧、田间作物焚烧、家庭烹饪等。本文仅含100张左右。

2.H²O 行人交互检测数据集

数据集链接:http://m6z.cn/6fzmQf

H²O由V-COCO数据集中的10301张图像组成,其中添加了3635张图像,这些图像主要包含人与人之间的互动。所有的H²O图像都用一种新的动词分类法进行了注释,包括人与物和人与人之间的互动。该分类法由51个动词组成,分为5类:

  • 描述主语一般姿势的动词
  • 与主语移动方式有关的动词
  • 与宾语互动的动词
  • 描述人与人之间互动的动词
  • 涉及力量或暴力的互动动词
3.SpotGarbage垃圾识别数据集

数据集链接:http://m6z.cn/5ZMmRG

图像中的垃圾(GINI)数据集是SpotGarbage引入的一个数据集,包含2561张图像,956张图像包含垃圾,其余的是在各种视觉属性方面与垃圾非常相似的非垃圾图像。

4.SUN09场景理解数据集

数据集链接:http://m6z.cn/60wX8r

SUN09数据集包含12000个带注释的图像,其中包含200多个对象类别。它由自然、室内和室外图像组成。每个图像平均包含7个不同的注释对象,每个对象的平均占用率为图像大小的5%。对象类别的频率遵循幂律分布。发布者使用 397 个采样良好的类别进行场景识别,并以此搭配最先进的算法建立新的性能界限。

该数据集由普林斯顿视觉与机器人实验室于 2014 年发布,相关论文有《SUN Database: Large-scale Scene Recognition from Abbey to Zoo》、《SUN Database: Exploring a Large Collection of Scene Categories》。

5.生活垃圾数据集

数据集链接: http://m6z.cn/6n5Adu

大约9000多张独特的图片。该数据集由印度国内常见垃圾对象的图像组成。图像是在各种照明条件、天气、室内和室外条件下拍摄的。该数据集可用于制作垃圾/垃圾检测模型、环保替代建议、碳足迹生成等。

6.HICO-DET人物交互检测数据集

数据集链接:http://m6z.cn/5DdK6D

HICO-DET是一个用于检测图像中人-物交互(HOI)的数据集。它包含47776幅图像(列车组38118幅,测试组9658幅),600个HOI类别,由80个宾语类别和117个动词类别构成。HICO-DET提供了超过150k个带注释的人类对象对。V-COCO提供了10346张图像(2533张用于培训,2867张用于验证,4946张用于测试)和16199人的实例。