Feature Scaling and normalization in cross-validation set
Answering your last question first: your mean and std should be computed over the entire image. So for an RGB image you will get a mean/std vector of 3 values for the entire dataset (calculated per channel). Normalizing per pixel is wrong and would result in loss of information (you need to think of an image as a single discreet function, you can't treat each part of it separately without changing its overall meaning).

Regarding normalizing the validation set, you can manually create the validation set and use the "validation_data" argument in the fit method:

# Creating the validation set:
X_valid = X_train[int(0.9*len(X_train)):]
X_train = X_train[:int(0.9*len(X_train))]
y_valid = y_train[int(0.9*len(y_train)):]
y_train = y_train[:int(0.9*len(y_train))]

# pre-processing: divide by max and subtract mean

scale = np.max(X_train)
X_train /= scale
X_valid /= scale
X_test /= scale

mean = np.std(X_train)
X_train -= mean
X_valid -= mean
X_test -= mean    

model.fit(X_train, y_train, batch_size=16, epochs=10, validation_data=(X_valid, y_valid), verbose=2)