Trong nhiều ứng dụng hiện đại như họp trực tuyến, phần mềm chụp ảnh và video, tách đối tượng người ra khỏi ảnh nền đơn giản là một bước quan trọng. Việc này giúp thay đổi nền ảnh (background replacement), tạo hiệu ứng xóa phông (bokeh) hoặc hỗ trợ các hệ thống theo dõi đối tượng. Ngày nay, nhờ các thư viện AI như MediaPipe, bạn có thể thực hiện điều này dễ dàng chỉ với vài dòng code Python.
Nếu bạn từng thực hiện Nhận diện khuôn mặt bằng AI hoặc Phát hiện chuyển động trong video với OpenCV, bài viết này sẽ giúp bạn tiến xa hơn bằng cách xử lý ảnh và video để tách người ra khỏi phông nền, mang lại sản phẩm thú vị và hữu ích cho đồ án hoặc ứng dụng thực tế.
Tập dữ liệu và công cụ
Tách đối tượng người ra khỏi ảnh nền đơn giản là kỹ thuật quan trọng trong nhiều ứng dụng như video call, chụp ảnh, livestream hoặc xử lý hậu kỳ. Nhờ tách người ra khỏi nền, bạn có thể áp dụng hiệu ứng thay nền (background replacement) hoặc xóa phông để làm nổi bật subject chính.
Để thực hành tách đối tượng người ra khỏi ảnh nền đơn giản, bạn có thể sử dụng hình ảnh mẫu như trong phần mở đầu hoặc tải bộ dataset người/phiên bản segmentation thực tế. Ví dụ:
-
Human Segmentation Dataset trên GitHub chứa 300 ảnh cùng mask.
-
Hoặc dataset lớn hơn từ [schirrmacher/humans trên Hugging Face]
Bài viết này ưu tiên dùng MediaPipe – thư viện có sẵn của Google giúp tách người nhanh chóng, chuẩn bị sẵn sàng cho tách đối tượng người ra khỏi ảnh nền đơn giản mà người mới cũng có thể chạy ngay.
Cài đặt và nạp ảnh mẫu
Để thực hiện tách đối tượng người ra khỏi ảnh nền đơn giản, bạn cần cài đặt mediapipe và opencv-python. Đây là hai thư viện chính hỗ trợ xử lý ảnh/video hiệu quả. Sau khi cài đặt, bạn thử nạp ảnh để chắc chắn việc load ảnh thành công trước khi áp dụng segmentation.
Việc nạp ảnh thử trước khi chạy segmentation giúp bạn kiểm tra dữ liệu đầu vào đã đúng đường dẫn và định dạng, từ đó tránh lỗi trong quá trình thực thi.
pip install mediapipe opencv-python
import cv2
image = cv2.imread('person_sample.jpg')
cv2.imshow('Ảnh gốc', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Tách đối tượng người ra khỏi ảnh nền đơn giản bằng MediaPipe
MediaPipe Selfie Segmentation giúp bạn tách đối tượng người ra khỏi ảnh nền đơn giản bằng cách tạo ra một mask – vùng chứa người. Khi mask này áp dụng lên ảnh gốc, phần nền sẽ bị loại bỏ hoặc thay đổi. Hiệu ứng này cực kỳ phù hợp nếu bạn muốn nhận diện nét, vùng giữa subject và background.
Thư viện có thể xử lý nhanh trên CPU, không cần chuyên sâu về deep learning, vốn phù hợp với người mới tập làm segmentation.
import mediapipe as mp
import numpy as np
import cv2
mp_selfie = mp.solutions.selfie_segmentation
seg = mp_selfie.SelfieSegmentation(model_selection=1)
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
res = seg.process(rgb)
mask = res.segmentation_mask > 0.5
output = image.copy()
output[~mask] = (255,255,255) # nền trắng
cv2.imshow('Tách người khỏi nền', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
Thay nền mới sau khi tách
Sau khi tách đối tượng người ra khỏi ảnh nền đơn giản, bạn có thể thay nền trắng bằng ảnh nền tùy chỉnh. Kỹ thuật này hữu ích cho việc làm poster, chụp ảnh profile, hoặc video call, tạo vẻ chuyên nghiệp cho sản phẩm cuối cùng.
Việc áp nền mới cũng đơn giản: resize ảnh nền về kích thước gốc, rồi thay pixel nền theo mask đã phân đoạn.
new_bg = cv2.imread('new_bg.jpg')
new_bg = cv2.resize(new_bg, (image.shape[1], image.shape[0]))
final = image.copy()
final[~mask] = new_bg[~mask]
cv2.imshow('Ảnh nền mới', final)
cv2.waitKey(0)
cv2.destroyAllWindows()
Phân đoạn người ra khỏi ảnh nền trong video
Không chỉ áp dụng cho ảnh đơn lẻ, bạn có thể dùng MediaPipe để tách đối tượng người ra khỏi ảnh nền đơn giản trong video hoặc livestream từ webcam. Thao tác này rất phù hợp cho các ứng dụng thời gian thực như Zoom filter, video marketing, hoặc kiểm thử UI khi thay nền trực tiếp.
Phần code loop trên webcam sẽ xử lý segmentation mỗi khung hình và hiển thị kết quả ngay lập tức.
import cv2
import mediapipe as mp
mp_selfie = mp.solutions.selfie_segmentation
seg = mp_selfie.SelfieSegmentation(model_selection=1)
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
res = seg.process(rgb)
mask = res.segmentation_mask > 0.5
frame[~mask] = (255,255,255) # nền trắng
cv2.imshow('Tách người real-time', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Kết luận
Qua các bước trên, bạn đã thực hiện thành công quy trình tách đối tượng người ra khỏi ảnh nền đơn giản bằng các công cụ MediaPipe và OpenCV. Bạn đã học cách xử lý ảnh tĩnh, thay nền và thực hiện segmentation theo thời gian thực – phù hợp cho các dự án AI hoặc đồ án học thuật.
Nếu bạn muốn mình mở rộng hơn với các mô hình như Mask R‑CNN hoặc triển khai app web thay nền trực tuyến (Flask/Streamlit), hoặc làm thêm Colab Notebook chạy mẫu trực tiếp, hãy cho mình biết nhé!

