本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Matlab保存数据时显示:错误使用 imwrite>validataSizes 图像的数据必须少于2^23-1 字节 。
问题描述:
最近在用matlab对图像进行初处理,由于处理的量级比较大,单张图片据可能超过了正常的处理范围,导致matlab在处理时能处理,但是使用imwrite()进行保存的时候,就显示了:
validataSize(data); %data为要保存的数据
如下图问题所示:
数据过多,无法保存。
1、解决方法(uint8格式转换):
%原来的步骤
img = imread('path')
imwrite(img,'new path')
%解决问题的步骤(节省空间,能写出)
img = imread('path')
img1 = im2uint8(img)
imwrite(img1,'new path')
1.1 处理效果:
内存之只有原来的约1/5,用PS打开查看之后,发现像素并无丢失。
2 、解决方法(设置validataSizes数值)
此处感谢@sunxueping01 提供的方法。
=============================================================
下面是关于解决方法1的思路(需要可以看下去)
思路1:imwrite()
针对这个存在的问题,我最开始解决问题的方法是朝着imwrite()这个函数去的。
因为我想着数据写不出来是因为使用imwrite()的时候,对于大图像的写入需要特定的格式。 然而,搜!寻!无!果!
思路2:matlab的内存问题
处理不了,说明处理过程中可能是matlab的内存溢出了,导致程序处理的问题,所以我就想着修改一下matlab处理程序的内存上限。 当然,结果还是不行。
思路3:图片或者数据的格式问题
matlab中,图像等的写出写入都是以数据的形式写出来的,而数据在接触图像处理的时候就知道,比如int型,double型等。
当你走入绝境的时候,不要放弃任何一个可以求生的机会。
解决问题的“峰回路转”
情况跟我的差不多,点开看,回答给了我启示。
结合之前关于问题解决的思考3,决定去查一查uint8的使用。
文章1:im2uint8 百度百科:有用
文章2:matlab中uint8,double,im2uint8,im2double的区别
文章2这么写的:
说uint8可以节省空间,还用了double做比较,基于想要弄清楚问题的想法,我去查了查double与uint8的区别。
uint8与doule之间 差不多1:8的内存比例。(简直是写出大内存数据的救星!!!)
并且,并不变动数据,就算变动,也是unit8和double之间转换一下处理就行,可以参考:matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明
处理效果:
内存之只有原来的约1/5,用PS打开查看之后,发现像素并无丢失。(完结撒花)
======================================================END