关于使用matlab imwrite函数转换三维数组为图像时,导致结果为空白或大部分损坏的原因
问题起因
是想做一个根据rgb数据值生成图像的操作,无奈不能自己捏造大量的数据,来生成一幅像样的图像,我只能从网上随便拉了张,把他的rgb数据导出,然后再导入成三维矩阵从而根据rgb数据生成图像。
流程
先在网上拉张图!
好不容易找了张小一点的
接下来是使用matlab读取保存图像rgb数据
clear
clc
ttt=imread('tttt.jpg');
image_r=ttt(:,:,1);
image_g=ttt(:,:,2);
image_b=ttt(:,:,3);
xlswrite('image_r.xlsx',image_r);
xlswrite('image_g.xlsx',image_g);
xlswrite('image_b.xlsx',image_b);
现在已经把r,g,b数据分别保存在三个xlsx文件中了
接下来进行第二步,从xlsx文件中导出r,g,b数据然后生成图像
clear
clc
r = xlsread('image_r.xlsx');
g = xlsread('image_g.xlsx');
b = xlsread('image_b.xlsx');
imdata(:,:,1) = r;
imdata(:,:,2) = g;
imdata(:,:,3) = b;
imwrite(imdata,'result.jpg')%写图片
imshow(imdata)
好了问题来了
生成的图长成了这样
当然还会有别的情况,我也尝试了,结果要不是空白要不是长这样
我他喵本来以为,因为众所周知jpg是个有损压缩,我想这何止有损,简直全损
后来导出文件改成.bmp一样长这样
后来我看有人说是数据类型的原因,说255以内必须是int,如果是double要全部除以255,改在0-1.0以内,可是我试了也没用
后来我突然想到,这么做光有rgb数据了,图像的头文件呢?没有!
头文件是个好东西,然后我翻遍了matlab的函数也没找到怎么提取头文件,要是有请各位大佬给我评论一声,我学疏浅薄,实在没找到。
最后的解决办法就是。导入数据时先把原图导进来,然后把它的r,g,b依次替换。这样头文件依旧存在,只是改变了数据文件而已。
clear
clc
imdata = imread('tttt.jpg');
r = xlsread('image_r.xlsx');
g = xlsread('image_g.xlsx');
b = xlsread('image_b.xlsx');
imdata(:,:,1) = r;
imdata(:,:,2) = g;
imdata(:,:,3) = b;
imwrite(imdata,'result.bmp')%
最后完美生成效果图
不过为了大家看出图片的rgb的确是修改过了的,而不是原图数据
我暂且把g,b图层换一下再给大家显示一次
这下没问题了,的确是rgb改变了的!