一、图像预处理
1.将.raw文件处理为强度图
def divid_img(path):
#用型号PHX050S-PC偏振相机采集天空图像并保存为“.raw”文件,每通道位深度为16位
#即取值为0-65535,所以数据类型用“np.uint16”
#np.fromfile()读取,输出为array格式的向量
rawImg = np.fromfile(path,dtype=np.uint16)
#将向量或矩阵改变形状(reshape)
rawImg = rawImg.reshape((2048,2448))
#初始化四个矩阵
data1 = np.zeros((1024,1224), dtype=float)
data2 = np.zeros((1024,1224), dtype=float)
data3 = np.zeros((1024,1224), dtype=float)
data4 = np.zeros((1024,1224), dtype=float)
#依据偏振相机中金属光栅上四个角度特性,从矩阵(2048,2448)中提取像素点,
#并保存为四个矩阵(1024,1224)
for i in range(1024):
for j in range(1224):
data1[i][j] = rawImg[i*2][j*2]
for i in range(1024):
for j in range(1224):
data2[i][j] = rawImg[i*2][j*2+1]
for i in range(1024):
for j in range(1224):
data3[i][j] = rawImg[i*2+1][j*2]
for i in range(1024):
for j in range(1224):
data4[i][j] = rawImg[i*2+1][j*2+1]
#保存四个角度的光强
I135 = data3
I0 = data1
I45 = data2
I90 = data4
#天空偏振光的总光强
s0 = I0+I90
return s0
import matplotlib.pyplot as plt
import numpy as np
path = 'Image6.raw'
img = divid_img(path)
plt.imshow(img, cmap='gray')
2.裁剪图片并通过mask只保留中间有效区域
from skimage.draw import circle
import cv2
img_1 = img[int(img.shape[0]/2-300):int(img.shape[0]/2+300),
int(img.shape[1]/2-300):int(img.shape[1]/2+300)]
#构建600*600mask掩膜,数据类型为“np.float”,要与图像的数据类型一样
mask=np.zeros([600,600],dtype=np.float)
#提取半径为300的圆形区域的像素点坐标,并设置这些区域为1
rr, cc = circle(img_1.shape[0]/2,img_1.shape[1]/2,300)
mask[rr,cc] = 1
#通过乘法将mask与图像结合
img1= cv2.multiply(img_1, mask)
#显示灰度图
plt.imshow(img1, cmap='gray')
3.扩增图像:
#改变图像的亮度
from skimage import exposure
import matplotlib.pyplot as plt
#I=I^g,将每个像素缩放到0~1后,对像素进行幂运算,得到新的像素值。公式中的g就是gamma值。
gam1 = exposure.adjust_gamma(img1,1.8) #调暗
gam2 = exposure.adjust_gamma(img1,0.8) #调亮
plt.subplot(121),plt.imshow(gam1, cmap='gray')
plt.subplot(122),plt.imshow(gam2, cmap='gray')
#直方图均衡化Histogram Equalization
img_eq = exposure.equalize_hist(img1)
plt.subplot(121),plt.imshow(img1, cmap='gray')
plt.subplot(122),plt.imshow(img_eq, cmap='gray')
# 对比度拉伸Contrast stretching
p2, p98 = np.percentile(img1, (2, 98))
img_rescale = exposure.rescale_intensity(img1, in_range=(p2, p98))
plt.figure(figsize=(16, 12))
plt.subplot(121),plt.imshow(img1, cmap='gray')
plt.subplot(122),plt.imshow(img_rescale, cmap='gray')
def trainGenerator(batch_size,train_path,image_folder,mask_folder,aug_dict,
image_color_mode = "grayscale",mask_color_mode = "grayscale",
image_save_prefix = "images",mask_save_prefix = "masks",num_class = 2,
save_to_dir = None,target_size = (600,600),seed = 1):
image_datagen = ImageDataGenerator(**aug_dict)
mask_datagen = ImageDataGenerator(**aug_dict)
image_generator = image_datagen.flow_from_directory(
train_path,
classes = [image_folder],
class_mode = None,
color_mode = image_color_mode,
target_size = target_size,
batch_size = batch_size,
save_to_dir = save_to_dir,
save_prefix = image_save_prefix,
seed = seed)
mask_generator = mask_datagen.flow_from_directory(
train_path,
classes = [mask_folder],
class_mode = None,
color_mode = mask_color_mode,
target_size = target_size,
batch_size = batch_size,
save_to_dir = save_to_dir,
save_prefix = mask_save_prefix,
seed = seed)
train_generator = zip(image_generator, mask_generator)
for (img,mask) in train_generator:
yield (img,mask)
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
#图片旋转或平移
data_gen_args = dict(
rotation_range=40,
# width_shift_range=40,
# height_shift_range=40,
fill_mode='reflect') #比nearest生成的图像要更清晰
myGenerator = trainGenerator(1,'F:/cai/sky727/图像扩充
/旋转/','img','mask',data_gen_args,save_to_dir =
"F:/cai/sky727/图像扩充/旋转/new")
num_batch = 1
for i,batch in enumerate(myGenerator):
if(i >= num_batch):
break