diff --git a/bob/io/image.py b/bob/io/image.py
index 16ccb62a660808c3b09685de599e2a17afa8152c..832225afd44bdce7f81516575fcdfb5ee881b703 100644
--- a/bob/io/image.py
+++ b/bob/io/image.py
@@ -1,4 +1,5 @@
 import numpy as np
+from PIL import Image
 
 
 def to_matplotlib(img):
@@ -45,6 +46,46 @@ def to_bob(img):
     return np.moveaxis(img, -1, -3)
 
 
+def bob_to_pillow(img):
+    """Converts the floating or uint8 image to a Pillow Image.
+
+    Parameters
+    ----------
+    img : numpy.ndarray
+        A gray-scale or RGB color image in Bob format (channels first)
+
+    Returns
+    -------
+    Image
+        An object of pillow.Image.
+    """
+    # first convert to matplotlib format
+    img = to_matplotlib(img)
+    # if img is floating point, convert to uint8
+    if isinstance(img, np.floating):
+        # we expect float images to be between 0 and 1
+        img = np.clip(img, 0, 1) * 255
+        img = img.astype(np.uint8)
+
+    return Image.fromarray(img)
+
+
+def pillow_to_bob(img):
+    """Converts an RGB or gray-scale pillow image to Bob format
+
+    Parameters
+    ----------
+    img : Image
+        A Pillow Image
+
+    Returns
+    -------
+    numpy.ndarray
+        Image in Bob format
+    """
+    return to_bob(np.array(img))
+
+
 def opencvbgr_to_bob(img):
     """Returns a view of the image from OpenCV BGR format to Bob RGB format.
     This function works with images, batches of images, videos, and higher
diff --git a/conda/meta.yaml b/conda/meta.yaml
index 63f2cb29c4d8f222d5128638241675c481b28edc..2c121cf51b4c7f8f3eb28cb03b87c972639e0629 100644
--- a/conda/meta.yaml
+++ b/conda/meta.yaml
@@ -24,11 +24,13 @@ requirements:
     - bob.extension
     - h5py {{ h5py }}
     - numpy {{ numpy }}
+    - pillow {{ pillow }}
     - imageio {{ imageio }}
   run:
     - python
     - setuptools
     - {{ pin_compatible('numpy') }}
+    - {{ pin_compatible('pillow') }}
     - {{ pin_compatible('imageio') }}
     - {{ pin_compatible('h5py') }}