Hi, I am

Ngô Tôn

I am a programmer.

Home / AI/ML/DL/DS / Face Morphing Using OpenCV

Face Morphing Using OpenCV

Hôm nay, Ngô Tôn .IT sẽ cùng các bạn tìm hiểu cách biến mặt này thành mặt khác bằng OpenCV – Face Morphing.

Để thực hiện bài này, các bạn nên tìm hiểu trước về 2 bài toán này đó là: Facial Landmark Detection và Delaunay Triangulation.

Morphing là gì?

Morphing là một kỹ thuật xử lý hình ảnh được sử dụng để biến đổi trạng thái từ một hình ảnh này sang hình ảnh khác.

Ý tưởng đằng sau Image Morphing khá đơn giản. Đưa ra hai hình ảnh IJ, chúng ta muốn tạo một hình ảnh ở giữa M bằng cách trộn các hình ảnh IJ. Sự pha trộn giữa ảnh I và J được kiểm soát bởi một tham số α nằm trong khoảng từ 0 đến 1. Khi α = 0 thì ảnh M sẽ giống ảnh I và khi α = 1 ảnh M sẽ giống ảnh J. Như vậy, chúng ta có thể áp dụng cho từng pixel (x, y):

M(x, y) = (1 –  α)I(x, y) + αJ(x, y)

Vì vậy, để biến hình ảnh I thành hình ảnh J, trước tiên chúng ta cần thiết lập sự tương ứng pixel giữa hai hình ảnh. Nói cách khác, đối với mỗi pixel (xi, yi) trong hình ảnh I, chúng ta cần tìm pixel (xj, yj) tương ứng trong hình ảnh J. Giả sử chúng ta đã tìm thấy những điểm tương ứng này, chúng ta có thể kết hợp các hình ảnh theo hai bước:

  • Đầu tiên, chúng ta cần tính toán vị trí (xm, ym) của pixel trong hình ảnh được biến đổi. Nó được đưa ra bởi phương trình sau (1):
    • xm = (1 – α) xi + α xj
    • ym = (1 – α) yi + α yj
  • Sau đó, chúng ta cần tìm cường độ của pixel tại (xm, ym) bằng công thức sau (2):
    • M(xm, ym) = (1 –  α)I(xi, yi) + αJ(xj, yj)

Rất dễ dàng để tìm thấy một vài điểm tương ứng. Để biến hình hai đối tượng khác nhau, chẳng hạn như mặt mèo và mặt người, chúng ta có thể nhấp vào một vài điểm trên hai hình ảnh để thiết lập sự tương ứng và nội suy kết quả cho các pixel còn lại. Tiếp theo chúng ta sẽ xem Face Morphing được thực hiện chi tiết như thế nào, nhưng kỹ thuật tương tự có thể được áp dụng cho hai đối tượng bất kỳ.

face-morphing

Face Morphing

Biến đổi hai khuôn mặt (Face Morphing) có thể được thực hiện theo các bước sau. Để đơn giản, chúng ta sẽ cho rằng các hình ảnh có cùng kích thước, nhưng nó không phải là điều cần thiết.

1. Tìm điểm tương ứng bằng cách sử dụng tính năng phát hiện đặc điểm khuôn mặt (Facial Feature Detection)

Hãy bắt đầu bằng cách đạt được điểm tương ứng.

Đầu tiên, chúng ta có thể nhận được rất nhiều điểm bằng cách tự động (hoặc thủ công) bằng Facial Landmark Detection. Mình đã sử dụng dlib để phát hiện 68 điểm tương ứng. Các bạn cài đặt thư viện dlib và tải về file shape_predictor_68_face_landmarks.dat

Tiếp theo, chúng ta thêm bốn điểm nữa (một điểm ở tai bên phải, một điểm ở cổ và hai điểm ở vai).

Cuối cùng, thêm các góc của hình ảnh và nửa điểm giữa các góc đó làm điểm tương ứng.

face_landmark_detection.py

2. Tam giác phân Delaunay (Delaunay Triangulation)

Từ bước trước, chúng ta có hai bộ 80 điểm – một bộ cho mỗi hình ảnh. Chúng ta có thể tính giá trị trung bình của các điểm tương ứng trong hai tập hợp và thu được một tập hợp duy nhất là 80 điểm. Trên tập hợp các điểm trung bình này, chúng ta thực hiện Delaunay Triangulation. Kết quả của tam giác Delaunay là một danh sách các tam giác được biểu diễn bằng các chỉ số của các điểm trong mảng 80 điểm. Trong trường hợp cụ thể này, phép tam giác tạo ra 149 tam giác nối 80 điểm.

Phương thức tam giác được lưu trữ dưới dạng một mảng ba cột.

Triangulation Points
39 41 38
36 31 29
38 37 21

Nó cho thấy rằng các điểm 39, 41 và 38 tạo thành một tam giác, v.v.

delaunay.py

3. Nắn ảnh và pha trộn (Warping images and alpha blending)

Bây giờ, chúng ta có thể kết hợp hai hình ảnh một cách thông minh. Như đã đề cập trước đây, lượng pha trộn sẽ được kiểm soát bởi một tham số α.

Tạo một hình thái bằng cách sử dụng các bước sau.

  • Tìm vị trí của các điểm đối tượng trong hình ảnh được biến đổi: Trong hình ảnh được biến đổi, chúng ta có thể tìm vị trí của tất cả 80 điểm bằng cách sử dụng phương trình (1).
  • Tính các phép biến đổi affine: Vậy ta có tập hợp 80 điểm trong hình 1, một tập hợp khác gồm 80 điểm trong hình 2 và tập hợp thứ ba gồm 80 điểm trong hình được biến đổi. Chúng ta cũng biết tam giác xác định trên những điểm này. Chọn một tam giác trong hình 1 và tam giác tương ứng trong hình được biến đổi và tính phép biến đổi affine ánh xạ ba góc của tam giác trong hình 1 với ba góc của tam giác tương ứng trong hình được biến đổi. Trong OpenCV, điều này có thể được thực hiện bằng cách sử dụng getAffineTransform. Tính một phép biến đổi affine cho mọi cặp 149 tam giác. Cuối cùng, lặp lại quy trình của hình ảnh 2 và hình ảnh đã biến hình.
  • Nắn các hình tam giác: Đối với mỗi hình tam giác trong hình ảnh 1, sử dụng phép biến đổi affine được tính ở bước trước để biến đổi tất cả các pixel bên trong hình tam giác thành hình ảnh được biến đổi. Lặp lại điều này cho tất cả các hình tam giác trong hình 1 để có được phiên bản cong vênh của hình 1. Tương tự, có được phiên bản cong cho hình 2. Trong OpenCV, điều này đạt được bằng cách sử dụng hàm warpAffine. Tuy nhiên, warpAffine có hình ảnh chứ không phải hình tam giác. Bí quyết là tính toán hộp giới hạn cho hình tam giác, làm cong tất cả các pixel bên trong hộp giới hạn bằng cách sử dụng warpAffine, sau đó che các pixel bên ngoài hình tam giác. Mặt nạ hình tam giác được tạo bằng fillConvexPoly. Đảm bảo sử dụng blendMode BORDER_REFLECT_101 trong khi sử dụng warpAffine. Nó che giấu các đường nối tốt hơn.
  • Nắn ảnh pha trộn alpha: Trong bước trước, chúng ta đã thu được phiên bản chỉnh của hình ảnh 1 và hình ảnh 2. Hai hình ảnh này có thể được trộn alpha bằng cách sử dụng phương trình (2) và đây là hình ảnh biến đổi cuối cùng.

face_morph.py

Vậy là xong, chúng ta cùng xem kết quả nhé

About ngoton

Ngô Tôn is a programmer with passion for tailored software solutions. Comes with 7+ years of IT experience, to execute beautiful front-end experiences with secure and robust back-end solutions.

Check Also

Phục hồi ảnh cũ với Deep Learning

Mục lục Bring Old Photos Back To Life – Old Photo RestorationPhục hồi ảnh cũ với …

Leave a Reply

avatar
  Subscribe  
Notify of