Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Blur faces in imagery with Google Cloud Vision
import cv2
import io
import json
import numpy as np
import os
from import vision
from PIL import Image, ImageDraw
from StringIO import StringIO
# Load the image into memory
def load_image(img_filename):
with, 'rb') as image_file:
content =
return content
# Helper function to label an image
def label_image(client, content):
image = client.image(content=content)
# Perform face detection on the image file
faces = image.detect_faces()
return faces
# Blur faces in the image
def blur_image(image_content, faces, output_path):
img =
img = np.array(img)
# RGB/BGR channel flip for PIL-OpenCV compatibility
img = img[:, :, ::-1]
for face in faces:
box = [(bound.x_coordinate, bound.y_coordinate)
for bound in face.bounds.vertices]
top_left = box[0]
bottom_right = box[2]
x = top_left[0]
y = top_left[1]
w = bottom_right[0] - top_left[0]
h = bottom_right[1] - top_left[1]
roi = img[y:y+h, x:x+w]
roi_blurred = cv2.blur(roi, (15,15))
img[y:y+h, x:x+w] = roi_blurred
return img
# Mapping between blurred and unblurred imagery
def image_path_to_output_path(image_path):
fname, ext = image_path.split('.')
fname += '_blurred'
output_path = '.'.join([fname, ext])
return output_path
# Instantiate a client
vision_client = vision.Client()
# Set up image paths
image_paths = ['img/car.png']
for image_path in image_paths:
output_path = image_path_to_output_path(image_path)
print 'Loading {}'.format(image_path)
image_content = load_image(image_path)
print 'Labeling {}'.format(image_path)
faces = label_image(vision_client, image_content)
print 'Blurring {}'.format(image_path)
blurred = blur_image(image_content, faces, output_path)
print 'Saving {}'.format(output_path)
cv2.imwrite(output_path, blurred)
# If you need to rate limit (10 req/sec), uncomment this
# time.sleep(0.1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment