In [1]:
import cv2
import numpy as np
from PIL import Image

In [2]:
img  = Image.open("img/flowers.jpg")
img


Out[2]:

In [3]:
img_array = np.array(img)

In [4]:
cx, cy, r= 200, 200, 50

In [5]:
xy_map = np.transpose(np.mgrid[0:640, 0:455],[2,1,0]).astype('float32')

dist = np.sqrt(np.sum((xy_map-(cx,cy))**2, axis=2))
area = dist < 2*r
area2 = dist < 3*r
area2 = area2 &  (~area)

xy_map[area] = (xy_map[area]-(cx,cy))/2 + (cx, cy)
unit_ratio = r/dist[area2][:, None]
xy_map[area2] = (xy_map[area2]-(cx,cy))* (2-3*unit_ratio) + (cx,cy)

In [6]:
img_array_remap  = cv2.remap(img_array, xy_map, None, cv2.INTER_LINEAR)
Image.fromarray(img_array_remap)


Out[6]:

In [7]:
# 讀取已經學習過的臉部偵測 haar cascade
face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')

In [8]:
from urllib.request import urlopen
img = Image.open(urlopen("http://userimage2.360doc.com/12/0402/14/868418_201204021411470567.jpg"))
img = np.array(img)
#img = cv2.resize(img, (img.shape[1]*2, img.shape[0]*2))
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
Image.fromarray(img)


Out[8]:

In [12]:
# 從裡面來找找看臉吧
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
xy_map = np.transpose(np.mgrid[0:img.shape[1], 0:img.shape[0]],[2,1,0]).astype('float32')
for (x,y,w,h) in faces:    
    r = (max(w,h)/2)*1.1
    cx, cy = x+w/2, y+h/2
    dist = np.sqrt(np.sum((xy_map-(cx,cy))**2, axis=2))
    area = dist < 1.3*r
    area2 = dist < 1.6*r
    area2 = area2 &  (~area)
    xy_map[area] = (xy_map[area]-(cx,cy))/1.3 + (cx, cy)
    unit_ratio = r/dist[area2][:, None]
    xy_map[area2] = (xy_map[area2]-(cx,cy))* (2 - 1.6*unit_ratio) + (cx,cy)

img_remap  = cv2.remap(img, xy_map, None, cv2.INTER_LINEAR)
Image.fromarray(img_remap)


Out[12]:

In [ ]: