opencv在输出不同文件格式输出的时候文件空间的大小不一样

opencv用imwrite可以输出不同的文件格式如bmp,png,jpg这些图片的格式。在main函数中写入一下一串代码时候:

      // 读入一幅图像
Mat img;
img = imread("C:/Users/SLJ/Desktop/example/pic2.jpg");


if (!img.data)
{
cout << "Cannot load image!" << endl;
return -1;
}

        imwrite("C:/Users/SLJ/Desktop/img.bmp", img);

        imwrite("C:/Users/SLJ/Desktop/img.png", img);

        imwrite("C:/Users/SLJ/Desktop/img.jpg", img);

waitKey(0);

return 0;

结果所得到的图像信息分别为:


然而原始的图像才30.5K,问题是为什么输出的图像反而变大了。而且图像大小的顺序是:bmp 大于 png 大于 jpg 大于 原jpg图像。下面是关于JPG与BMP图像格式的描述:

BMP:优点(无损压缩,图质最好),缺点(文件太大,不利于网络传输)
JPG:优点(文件小,利于网络传输),缺点(画质损失)
BMP格式的图片转换成JPG格式质量会下降,但JPG转换成BMP图质是不可逆转的。

BMP
BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

JPG
JPG全名是JPEG。JPEG图片以 24 位颜色存储单个位图。JPEG 是与平台无关的格式,支持最高级别的压缩,不过,这种压缩是有损耗的。渐近式 JPEG 文件支持交错。
 
JPEG其实是经过复杂运算过的BMP,它们都属于位图。BMP没有一点压缩,完整记录图片,但体积很大。
JPG、GIF、PNG等经过压缩,品质相对来说要差去一点(我们肉眼可能看不出),但体积小非常多,5M的BMP,在大小不变下,可以压缩到100K的JPG

BMP是没有经过压缩的:刚才测试的图像的像素为:800*530。根据计算可以得出的bmp照片应该有的大小为:800*530*3(RGB24位)=1272000字节=1272KB;而图像所显示的大小正好是:1.21M(1.21M*1024KB/M=1239KB),计算结果比1272KB略小的原因是1.21M本身就是一个近似值。由此也能证实BMP是完全没有经过压缩的图像格式。
根据像素大小可以推断,jpg格式的图片存储空间不应该这么小,原因是jpg本身就是一种压缩的数据格式。由此可见opencv读入原为jpg格式的文件,读入的Mat矩阵一定是“扩充”了原来jpg的图片容量大小(向矩阵中增加了一些元素)变成类似于bmp的图像格式的矩阵。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值