Skip to content

Instantly share code, notes, and snippets.

@tfolbrecht
Forked from mcdickenson/blur_faces.py
Created June 10, 2019 04:28
Show Gist options
  • Save tfolbrecht/5e6b136da5a59393b5c6020fd8d82370 to your computer and use it in GitHub Desktop.
Save tfolbrecht/5e6b136da5a59393b5c6020fd8d82370 to your computer and use it in GitHub Desktop.
Blur faces in imagery with Google Cloud Vision
import cv2
import io
import json
import numpy as np
import os
from google.cloud import vision
from PIL import Image, ImageDraw
from StringIO import StringIO
# Load the image into memory
def load_image(img_filename):
with io.open(img_filename, 'rb') as image_file:
content = image_file.read()
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 = Image.open(StringIO(image_content))
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