MATLAB 处理hdf5图像数据集使用总结

最近使用MATLAB要对要使用的图片进行小波变换(wavelet analysis)处理后再使用,顺便也学了一下MATLAB,虽然以前也接触过,但和“安装了一下软件”的接触水平没啥区别。

最近也突然感悟到,编程的真谛在于你首先要清楚你要干什么,然后才是结合具体的语言的语法、函数、特性等具体的手段去实现它。所以编程语言虽然重要,但并不是最核心的,最核心的是你知道你要干什么,编程的核心不是编程语言,而是如何达到目的思路。剩下的就是交给Google或度娘,还有自己在具体编程的时的经验积累以及触类旁通的能力了。


使用MATLAB一定要注意在语句后加不加分号 “ ”的问题!另外MATLAB运行的路径也要搞清楚在哪,路径问题对任何一种语言都是极为重要的,它牵涉到你能不能找到你要操作的对象。

我要处理的数据是HDF5文件,一般以 .hdf5 或 .h5 为文件后缀。MATLAB读取hdf5文件使用

hdf5read(filename,keyname), 未来会改为h5read 函数舍弃hdf5read;

比如:data = hdf5read('DLL_xyz.hdf5','data')   (或者:h5read('DLL_xyz.hdf5','/data') ,注意data前要多加一个/)

可以通过size函数来查看data的shape或格式情况:size(data),输出ans= 32,32,3,122361,表示这是一个HWCN格式的图像,宽高为32x32的图像,通道为3,RGB色(除了caffe和python中cv包是BGR外,其他的好像都是RGB,RGBA暂不考虑),共122361张图像。如果你不知道你的hdf5文档有什么主键keyname怎么办呢?这时候搜索就是好习惯啦,用hdf5info(filename)来解析你的活hdf5文件结构,如

info = hdf5info(filename), top_level = info.GroupHierarchy, 查看文件的层次结构可以继续:toplevel.Groups等,多试试你就知道是什么了。

MATLAB读取单张图像的方式是:file = imread(filename),显示图片一般用imshow(file)即可,其他的函数如image、imagesec等函数还需要你自己去试,我因为用不到所以就没再看。写图片到磁盘上用imwrite(file,filename)函数。

对图像进行小波变换并显示的方式为:

对于单张图片:

img = imread('lenna.png');
[cA,cH,cV,cD] = dwt2(img,'haar');
figure,imshow(img),title('原图');
subplot(2,2,1),imshow(uint8(cA)),title("低频分量");
subplot(2,2,2),imshow(uint8(cH)),title("水平细节分量");
subplot(2,2,3),imshow(uint8(cV)),title("垂直细节分量");
subplot(2,2,3),imshow(uint8(cD)),title("对角线细节分量");



对于多张图片:
对于多张图片需要把不同分量分开放在各个不同的figure中,需要给figure编号
data = hdf5read(filename,'data');
%images = permute(data,[4,1,2,3]);%转换HWCN格式为NHWC
dataSize = size(data);
img_num = ceil(dataSize(4)/1000); %ceil()余数向上取整
plot_num = ceil(sqrt(img_num));
fprintf('value of dataSize(4),img_num,plot_num  is:%d,%d,%d\n',dataSize(4),img_num,plot_num);

num = 1;
for i = 1:1000:dataSize(4)
    img = data(:,:,:,i); % matlab 数组切片方式
    [cA,cH,cV,cD] = dwt2(img,'haar');
    figure(1);
    subplot(plot_num,plot_num,num),imshow(uint8(cA));
    figure(2);
    subplot(plot_num,plot_num,num),imshow(uint8(cH));
    figure(3);
    subplot(plot_num,plot_num,num),imshow(uint8(cV));
    figure(4);
    subplot(plot_num,plot_num,num),imshow(uint8(cD));
    num = num + 1;
end

要注意的是在MATLAB中数组形式的数据是按列优先的顺序排的,和python等不一样,所以你读取出来的数据很可能看起来好像被镜像/旋转了,看着和原图不一样,尤其是hdf5文件,一般是互为转置的,更要小心。

程序中需要用什么功能的程序要自己去查,比如计算figure大小的时候使用ceil()函数可以将余数向上取整,round()是四舍五入;

mkdir(path)可以创建目录。

MATLAB的几种打印输出方式:format,disp,fprintf,其中fprintf是格式化输出控制函数,和C语言中的printf很像,但是和python中的不一样,不能直接用来输出值,必须要有格式化输出控制串,比如fprintf('value is :%d\n',value) 输出就没问题,但是fprintf(value)直接输出value值就会报错。

最后再强调一下,编程最重要的是思路,解决问题的思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值