Matlab保存数据时显示:错误使用 imwrite>validataSizes 图像的数据必须少于2^23-1 字节 问题的2种最终解决方法!!!

476 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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型等。

当你走入绝境的时候,不要放弃任何一个可以求生的机会。

解决问题的“峰回路转”

偶然翻到一篇问题,使用MATLAB以全分辨率将许多图像的蒙太奇图像保存为一个大图像文件(Using MATLAB to save a montage of many images as one large image file at full resolution)

情况跟我的差不多,点开看,回答给了我启示。 在这里插入图片描述 结合之前关于问题解决的思考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