一、数据获取
- 去国家气象科学数据中心下载雷达拼图 可以手动收集也可以写爬虫程序收集 手动收集就更改日期和时间
中国气象数据网 – Online Data
二、数据预处理
- 得到这些PNG图片后,首先做处理,只关注东南部分,其他的都扔掉(即从图中截取一个固定的长方形,就差不多是下面这个部分。保证截取的图中不包括左下角的南海诸岛以及右下角的基本反射率图例,这些都是干扰。你可以扔掉更多的部分,比如西宁以西都扔掉)。对所有的PNG图片都这样操作。
- 可能截取完之后,图片的像素仍然过多,那你可以截取更小的一个部分。比如:
pic_name_list cuted_img_list = [] save_img_path = os.path.join(wd, 'output') if not os.path.exists(save_img_path): os.makedirs(save_img_path) for pic_id in range(len(pic_name_list)): pic_name = str(pic_id) + '.png' temp = os.path.join(pic_root_path, pic_name) img = cv.imread(temp) print("This is the "+pic_name+":") print(img.shape) # (y, x) cuted_img = img[633:725, 510:665] #cv.imwrite(os.path.join(save_img_path, pic_name),cuted_img) cuted_img_list.append(cuted_img) plt.imshow(cuted_img) plt.show()
- 识别出基本反射率图例中每一个不同数值对应的颜色RGB常数,将图片中每个像素的RGB映射到基本反射率。如果没有对应的值(比如白色,黑色)统统设置为255。
- 转为灰度图。
def viewColor(pic, color):
#pic = Image.copy()
for i, nar in enumerate(pic):
for j, n in enumerate(nar):
if list(n) == list(color): # 南宁附近的三八线不需要的
pic[i][j] = np.array([255,255,255])
def get_usedColor(img):
from collections import defaultdict
colorMap = defaultdict(int)
usedColor = []
for i, nar in enumerate(img):
for j, n in enumerate(nar):
if str(n) not in colorMap:
usedColor.append(list(n))
colorMap[str(n)] += 1
return usedColor
def Image_Preprocessing(img):
use_color = []
use_color.append([178, 178, 178])
use_color.append([247, 221, 136])
use_color.append([104, 104, 104])
use_color.append([182, 255, 255])
use_color.append([0, 0, 102])
use_color.append([219, 144, 58])
use_color.append([58, 144, 219])
use_color.append([102, 0, 0])
use_color.append([255, 255, 182])
use_color.append([219, 255, 255])
use_color.append([219, 182, 182])
use_color.append([219, 144, 144])
use_color.append([219, 219, 219])
use_color.append([0, 58, 144])
use_color.append([182, 182, 182])
use_color.append([0, 0, 0])
use_color.append([58, 0, 0])
use_color.append([255, 219, 144])
for c in use_color:
viewColor(img, c)
return img
def pltShow(img):
plt.imshow(img)
plt.show()
def cvShow(img):
cv.imshow("mat", img)
cv.waitKey(0)
imgGray_list = []
for id, cuted_img in enumerate(cuted_img_list):
img = Image_Preprocessing(cuted_img)
imgGray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
pltShow(img)
temp = os.path.join(save_img_path, str(id)+'.png')
if os.path.exists(temp):
os.remove(temp)
cv.imwrite(temp, imgGray)
imgGray_list.append(imgGray)
print(str(id)+'.png is preprocesed, Wait next!')
print("Everything is OK!")
三、ConvLstm模型
## NEW NETWORK ##
def mainmodel():
# Inputs
dtype='float32'
nk = 128 # number of kernels for conv layers #48
fs = (3,3) # filter size for convolutional kernels
contentInput = Input(shape=(None, WIDTH, HEIGHT, 1), name='content_input', dtype=dtype)
# Encoding Network
x1 = ConvLSTM2D(nk, (5,5), padding='same', return_sequences=True, kernel_initializer ='he_normal', name='layer1')(contentInput)
x2 = ConvLSTM2D(nk, (5,5), padding='same', return_sequences=True, kernel_initializer ='he_normal', name='layer2')(x1)
# Forecasting Network
x3 = ConvLSTM2D(nk, (5,5), padding='same', return_sequences=True, kernel_initializer ='he_normal', name='layer3')(x1)
add1 = Add()([x3, x2])
x4 = ConvLSTM2D(nk, (5,5), padding='same', return_sequences=True, kernel_initializer ='he_normal', name='layer4')(add1)
# Prediction Network
conc = Concatenate()([x4, x3])
predictions = Conv3D(1, (5,5,5), activation='sigmoid', padding='same', name='prediction')(conc) #sigmoid original
model = Model(inputs=contentInput, outputs=predictions)
return model
四、训练
(待补)
五、预测
(待补)
文章出处登录后可见!
已经登录?立即刷新