专栏首页贾志刚-OpenCV学堂OpenCV中保存不同深度图像的技巧

OpenCV中保存不同深度图像的技巧

神存在于细节之中!

什么是图像深度

很多人开始学习OpenCV之后,接触前面几个API就包括imwrite函数,而且很快知道了如何去保存Mat对象为图像,常规代码如下:

imwrite("D:/result.png ", dst);

其中dst是Mat对象。

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

如果每个通道占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 表示的是保存图像时的选项,

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

  • ImwriteEXRTypeFlags
  • ImwriteFlags
  • ImwritePAMFlags
  • ImwritePNGFlags,

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

OpenCV中原始图像加载与保存压缩技巧

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);

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

// 加载图像
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);

两者效果对比如下:

32位图像保存

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

// 转为为16位图像
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);

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

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

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

本文分享自微信公众号 - OpenCV学堂(CVSCHOOL),作者:gloomyfish

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PASCAL VOC2012 数据集详解

    Pascal VOC2012作为基准数据之一,在对象检测、图像分割网络对比实验与模型效果评估中被频频使用,但是如果没有制作过此格式的数据集就会忽略很多细节问题,...

    OpenCV学堂
  • 总结 | 计算机视觉领域最常见几中损失函数

    损失函数在模型的性能中起着关键作用。选择正确的损失函数可以帮助你的模型学习如何将注意力集中在数据中的正确特征集合上,从而获得最优和更快的收敛。

    OpenCV学堂
  • OpenCV4 部署DeepLabv3+模型

    前面说了OpenCV DNN不光支持图像分类与对象检测模型。此外还支持各种自定义的模型,deeplabv3模型是图像语义分割常用模型之一,本文我们演示OpenC...

    OpenCV学堂
  • 基于神经网络的图像压缩技术

    (本文由软件工程师 Nick Johnston 和 David Minnen 发布)

    人工智能资讯小编
  • 学界 | 北邮夺冠CVPR 2018 DeepGlobe比赛,他们是这样做卫星图像识别的

    在刚刚结束的CVPR2018: DeepGlobe Road Extraction Challenge(全球卫星图像道路提取)比赛中,北京邮电大学信息与通信工程...

    大数据文摘
  • tf.image.resize_bilinear

    原链接: https://tensorflow.google.cn/versions/r1.12/api_docs/python/tf/image/resiz...

    于小勇
  • 用 OpenCV 检测图像中各物体大小

    在图像中测量物体的大小与计算从相机到物体之间的距离是相似的,在这两种情况下,我们需要定义一个比值,它测量每个给定指标的像素个数。

    AI研习社
  • 不会编程没关系,有了这个“Excel”,零基础上手生成网络

    编程不是人人都会,但Excel电子表格就是当代白领的必备技能啊!如果用Excel实现图像生成,那岂不是。。。

    量子位
  • python下载小说

    东风冷雪
  • 学界 | 谷歌研究院发布 NIMA:能评价图像有多美,还能让图像变得更美

    AI 科技评论按:本文发布于 Google Research Blog,作者为 Hossein Talebi, 机器感知领域软件工程师兼 Peyman Mila...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券