matlab的.mat矩阵数据与python的.npy数据的转换#npy转mat
import numpy as np
import scipy.io as sio #读.mat用的
from sklearn import preprocessing #图像归一化用的库
#npy转mat
# file_15 = '/home/.../np15/'
# file_17 = '/home/..../np17/'
# imgs15 = os.listdir(file_15)
# imgs17 = os.listdir(file_17)
# for img15 in imgs15:
# image = np.load(file_15 + img15) #np.load()实现读取.nyp数据.
# sio.savemat('/home/..../mat15/%s.mat' % img15[:-4], {"image15" : image}) #sio.savemat()保存成.mat
#直接sio.savemat('/home/..../mat15/%s.mat' % img15[:-4], image)会报错,得给个字典式的操作(不过我也不明白为啥)
#http://blog.csdn.net/Cheese_pop/article/details/77989865 我参考的这篇博客。
#mat转npy
# file_15 = '/home/..../smat15/'
# file_17 = '/home/..../smat17/'
# imgs15 = os.listdir(file_15)
# imgs17 = os.listdir(file_17)
#
# for img15 in imgs15:
# image = sio.loadmat(file_15 + img15) #sio.loadmat()读mat文件
# np.save('/home/lenovo/2Tdisk/Wkyao/FirstSetp/all11.1/s15/%s.npy' % img15[:-4], image) #np.save()保存成.npy
#另外补充一个python库中的图像归一化的函数((img-mean)/sdt) 像素减均值后再除以方差
# img_1 = preprocessing.scale(img)
这样就可以完成python和matlab之间的数据转换和传递了。
在MATLAB里读取.mat的时候,会出现一个矩阵数据,如:MxN 被作为整体元素,变成1x1 size 的问题,那么,这个时候需要用importdata()函数来读.mat 而不是简单的load(). 栗子:
im = importdata(fullfile(in_dir, ims(i).name));
顺便说一下fullfile( , ) 它的作用是把括号内的内容拼接起来,组成完整的字符串文件路径.
ims(i).name 的作用是, 返回ims序列中索引为i的元素的名字。 以上均是matlab语言。
再返回来说强大的np库:实现图像旋转、镜像。栗子:
# coding=utf-8
import os
import numpy as np
import tifffile as tiff
#实现图像旋转
def roate(in_folder, out_folder):
img_names = os.listdir(in_folder) # img_names为tiff图像
for name in img_names:
image = tiff.imread(in_folder + name)
image_90 = np.rot90(image) # 转90°
image_180 = np.rot90(image, 2) # 转180°
image_270 = np.rot90(image, 3) # 转270°
#这么理解吧:np.rot90(image,x) 函数,x缺省时,默认为1,逆时针转90度,x=2代表转180度,3代表转270度。
tiff.imsave(out_folder + name[:-5] + '_1.tiff', image_90)
tiff.imsave(out_folder + name[:-5] + '_2.tiff', image_180)
tiff.imsave(out_folder + name[:-5] + '_3.tiff', image_270)
return
#实现图像镜像
def mirror(in_folder, out_folder):
img_names = os.listdir(in_folder) # img_names为tiff图像
for name in img_names:
image = tiff.imread(in_folder + name)
rotate_1 = np.rot90(image.T) # 上下翻转 先转置,再逆时针转90度。
rotate_2 = np.rot90(image.T, 3) # 左右翻转 先转置,再逆时针转270度。
rotate_3 = np.rot90((np.rot90(image.T)).T, 3)
tiff.imsave(out_folder + name[:-5] + '_1.tiff', rotate_1)
tiff.imsave(out_folder + name[:-5] + '_2.tiff', rotate_2)
tiff.imsave(out_folder + name[:-5] + '_3.tiff', rotate_3)
tiff.imsave(out_folder + name[:-5] + '_0.tiff', image)
return
要是转置旋转绕不清,就那最简单的[[1,2],[3,4]]这个小矩阵在草稿纸上写,顺时针逆时针什么的就搞明白了~!
另外还有一些np的小函数:
img = img.astype(np.float16) 对于图像转位深很好用。
.index()函数:
返回列表中某元素第一次出现的位置(索引值)
栗子:
a = [1, 2, 8, 4]
b = a.index(8) :2 索引值为2.
未完待续......还回来补充,欢迎大家指正!