最近使用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值就会报错。
最后再强调一下,编程最重要的是思路,解决问题的思路。