Ok, also doch die Speicherallokation -)
Da du den Typ "double **" ja leider nicht ändern kannst, mußt du für diesen dann von Hand Speicher erzeugen, d.h. du hast kein wirkliches zweidimensionales Array, sondern einen "Zeiger auf ein Feld von Zeigern auf double".
So in etwa dann:
pbyGrayValue = new double*[Width];
for(int i=0; i<Width; i++)
pbyGrayValue[i] = new double[Height];
Entsprechendes dann für die anderen Zeiger auch (am besten als Funktion definieren).
Der Compiler kümmert sich dann aber um den korrekten Zugriff, wenn du 'ImageField->pbyGrayValue[x][y]' verwendest.
P.S: Und zum Freigeben dann entsprechend
for(int i=0; i<Width; i++)
delete[] pbyGrayValue[i];
delete[] pbyGrayValue;