Se ti modifica direttamente l'immagine non dovrebbe avere un valore di ritorno, di conseguenza assegnarla ad una variabile non ha molto senso.
Se invece ciò che fai è lavorare su una copia dell'immagine, controlla bene che il return avvenga sempre, quindi che non sia in nessun blocco di codice con condizione.
Questi sono i consigli che posso darti con le poche informazioni che hai dato.
Per quanto riguarda le variabili non definite:
Se non ho capito male il problema è che provi ad accedere alle variabili dichiarate nella funzione imm() dalla funzione ex().
Nella programmazione viene definita "Variable Scope" ovvero la visibilità di una variabile all'interno di un programma.
Ti consiglio di dare una letta a qualche articolo online però in breve: una variabile nasce e muore nella funzione in cui viene dichiarata
def main():
def func():
a = 5
print(a)
main()
Scrivere ciò porterà ad un errore poiché la variabile "a" viene definita ed eliminata nella funzione "func".
Spero di essere stato chiaro e di aver risolto eventuali dubbi.