A machine image is a Compute Engine resource that stores all the configuration, metadata, permissions, and data from multiple disks of a virtual machine (VM) instance. You can use a machine image in many system maintenance, backup and recovery, and instance cloning scenarios.
Snapshots incrementally back up data from your persistent disks. After you create a snapshot to capture the current state of the disk, you can use it to restore that data to a new disk. Compute Engine stores multiple copies of each snapshot across multiple locations with automatic checksums to ensure the integrity of your data.
You can create snapshots from disks even while they are attached to running virtual machine (VM) instances. The lifecycle of a snapshot created from a disk attached to a running VM instances is independent of the lifecycle of the VM instance.
A custom image is a boot disk image that you own and control access to. Use custom images for the following tasks:
Import a boot disk image to Compute Engine from your on-premises environment, or import virtual disks from VMs that are running on your local workstation or on another cloud platform.
Create an image from the boot disks of your existing Compute Engine instances. Then use that image to create new boot disks for your instances. This process lets you to create new instances that are preconfigured with the apps that you need without having to configure a public image from scratch.
Copy one image to another image by using either the gcloud tool or the API. Use the same process that you use to create an image, but specify another image as the image source. You can also create an image from a custom image in a different project.
Note that snapshots are different from custom images and machine images, which are useful for creating instance boot disks. You can see the link with a comparative table.
https://cloud.google.com/compute/docs/machine-images#when-to-use