Buenas.
Imagino que estás realizando pruebas desde un main en la función inicializar_imagen. Aclaro esto porque en el main que tienen que entregar no deberian llamar a inicializar_imagen directamente, de esto se encargará la funcion leer_imagen.
Hecha la aclaración anterior y suponiendo que vas a llamar directamente inicializar_imagen con 50 filas y 40 columnas desde el main, existen 2 formas pasar pin a esta función.
La primera forma:
incializar_imagen(&pin, filas, columnas);
/* aca va más codigo */
/* luego de terminar hay que liberar la memoria solo de los pixeles de pin (llamando a destruir_imagen) y NO de pin */
En este caso se define pin como una variable estructura y se la pasa por referencia a la función.
La segunda forma, que es la que mencionas en tu mensaje, es:
pin = malloc(sizeof(Imagen_t));
incializar_imagen(pin, filas, columnas);
/* luego de terminar hay que liberar la memoria de los pixeles de pin (llamando a destruir_imagen) y a pin (hay que hacer free(pin))*/
Ambas son correctas, sin embargo, la Nota 1 que está inmediatamente después de la descripción de incializar_imagen sugiere que en el main declaren las variables Imagen_t y pasen sus direcciones de memoria (a la función leer_imagen que luego llamara a incializar_imagen) . De esta forma no tienen que hacer malloc y free para variables de tipo Imagen_t.
Es algo entreverado el que haya 2 formas posibles, por lo que si algo no se entendió no dudes en volver a consultar.