Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Trang Chủ Hướng Dẫn Đồ Án Tách nền ảnh đơn giản bằng OpenCV
Hướng Dẫn Đồ ÁnLập Trình AI

Tách nền ảnh đơn giản bằng OpenCV

Chia sẻ
Chia sẻ

Tách nền ảnh (background removal) là một kỹ thuật phổ biến trong xử lý ảnh, đặc biệt hữu ích trong thiết kế đồ họa, thương mại điện tử và ứng dụng di động. Với OpenCV, bạn có thể thực hiện tách nền nhanh chóng chỉ với vài dòng code Python.

Trước khi bắt đầu, bạn có thể tìm hiểu thêm về xử lý ảnh qua bài Xử lý ảnh nhiễu bằng OpenCV trong đồ án để nắm rõ các bước tiền xử lý hình ảnh. Ngoài ra, bài Phân tích dữ liệu bán hàng bằng Python và Pandas sẽ giúp bạn làm quen với thao tác dữ liệu – kỹ năng cần thiết khi làm việc với tập ảnh lớn.

Chuẩn bị dữ liệu và môi trường

Dữ liệu ảnh

Bạn có thể tải một bức ảnh mẫu từ link sau hoặc dùng ảnh bất kỳ có nền rõ ràng (chẳng hạn một sản phẩm trên nền trắng):

📥 Link tải ảnh mẫu: https://github.com/opencv/opencv/raw/master/samples/data/lena.jpg

Cài đặt OpenCV

Cài đặt OpenCV cùng các thư viện hỗ trợ nếu đang làm việc trên Google Colab hoặc Jupyter:

!pip install opencv-python numpy matplotlib

Import các thư viện cần thiết:

import cv2
import numpy as np
import matplotlib.pyplot as plt

Đọc và hiển thị ảnh

Trước tiên, hãy đọc ảnh vào Python và hiển thị để kiểm tra.

# Đọc ảnh
image = cv2.imread('lena.jpg')
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Hiển thị ảnh
plt.figure(figsize=(6,6))
plt.imshow(image_rgb)
plt.title('Ảnh gốc')
plt.axis('off')
plt.show()

Tách nền bằng phương pháp Threshold đơn giản

Nếu nền có màu đồng nhất (ví dụ nền trắng), bạn có thể sử dụng phương pháp threshold để tạo mặt nạ và loại bỏ nền.

# Chuyển ảnh sang xám
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Áp dụng threshold
_, mask = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV)

# Tách nền
result = cv2.bitwise_and(image, image, mask=mask)

# Hiển thị kết quả
result_rgb = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(6,6))
plt.imshow(result_rgb)
plt.title('Ảnh đã tách nền')
plt.axis('off')
plt.show()

Tách nền với phương pháp GrabCut

GrabCut là một thuật toán nâng cao hơn để tách nền, đặc biệt hữu ích khi nền không đồng nhất.

# Tạo mask và định nghĩa vùng hình chữ nhật bao quanh đối tượng
mask = np.zeros(image.shape[:2], np.uint8)
rect = (50, 50, image.shape[1]-50, image.shape[0]-50)

# Tạo mô hình nền và tiền cảnh
bgdModel = np.zeros((1,65), np.float64)
fgdModel = np.zeros((1,65), np.float64)

# Áp dụng GrabCut
cv2.grabCut(image, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype('uint8')
image_nobg = image * mask2[:, :, np.newaxis]

# Hiển thị kết quả
plt.figure(figsize=(6,6))
plt.imshow(cv2.cvtColor(image_nobg, cv2.COLOR_BGR2RGB))
plt.title('Ảnh tách nền bằng GrabCut')
plt.axis('off')
plt.show()

Lưu ảnh kết quả với nền trong suốt

Để lưu ảnh với nền trong suốt, bạn cần chuyển sang định dạng PNG và thêm kênh alpha.

# Thêm kênh alpha
b, g, r = cv2.split(image_nobg)
alpha = mask2 * 255
result_rgba = cv2.merge((b, g, r, alpha))

# Lưu ảnh
cv2.imwrite('output_transparent.png', result_rgba)
print("Ảnh đã lưu với nền trong suốt.")

So sánh các phương pháp

Phương pháp threshold phù hợp khi nền đơn giản và đồng nhất, trong khi GrabCut hiệu quả hơn với nền phức tạp. Tuy nhiên, GrabCut yêu cầu một chút tương tác (xác định vùng bao quanh đối tượng) để đạt kết quả tốt nhất.

Mở rộng: Tách nền nhiều ảnh trong thư mục

Bạn có thể áp dụng cùng một kỹ thuật cho nhiều ảnh trong một thư mục để xử lý hàng loạt.

import os

input_folder = 'images/'
output_folder = 'outputs/'

for file in os.listdir(input_folder):
    if file.endswith('.jpg') or file.endswith('.png'):
        img = cv2.imread(os.path.join(input_folder, file))
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        _, mask = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV)
        result = cv2.bitwise_and(img, img, mask=mask)
        cv2.imwrite(os.path.join(output_folder, file), result)

Kết luận

Bạn vừa học cách tách nền ảnh đơn giản bằng OpenCV, từ phương pháp threshold đến thuật toán GrabCut. Đây là những kỹ thuật nền tảng để xử lý ảnh cho các ứng dụng như e-commerce, nhận diện đối tượng hay dựng ảnh sản phẩm. Với nền tảng này, bạn có thể tiếp tục học các phương pháp nâng cao hơn như DeepLab, U-Net hoặc sử dụng mô hình AI của remove.bg để tách nền tự động.

Tham Gia Nhóm – Hỗ Trợ Lập Trình

Hỗ Trợ Đồ Án – ThueDoAn.vn

Liên quan
Hướng Dẫn Đồ Án

Checklist 10 bước kiểm tra cuối cùng trước khi nhấn nút nộp đồ án

Thời điểm chuẩn bị nhấn nút nộp đồ án luôn mang lại...

Hướng Dẫn Đồ Án

Tuyệt chiêu đối phó với những giảng viên hướng dẫn ‘khó tính’ nhất

Giai đoạn làm đồ án tốt nghiệp luôn đi kèm với vô...

Hướng Dẫn Đồ Án

Tại sao việc quản lý Source Code bằng Git lại quan trọng hơn bạn nghĩ?

Trong thế giới lập trình hiện đại, mã nguồn chính là linh...

Hướng Dẫn Đồ Án

Những chức năng ‘thừa’ khiến bạn tốn thời gian mà không được cộng điểm

Làm đồ án tốt nghiệp là một cuộc đua thực thụ với...

Hướng Dẫn Đồ Án

Cách xử lý khi đề tài bị trùng lặp ý tưởng với các khóa trước quá nhiều

Lựa chọn đề tài đồ án luôn là bước khởi đầu đầy...

Hướng Dẫn Đồ Án

Làm sao để giải trình với giảng viên khi code bị nghi ngờ là đi chép?

Trong quá trình thực hiện đồ án, việc tham khảo mã nguồn...

Hướng Dẫn Đồ Án

Cảnh báo: Những nguồn share code ‘rác’ trên mạng cần tuyệt đối tránh

Trong quá trình làm đồ án, việc tìm kiếm sự hỗ trợ...

Hướng Dẫn Đồ Án

Sai lầm khi chọn công nghệ quá khó so với năng lực thực tế của bản thân

Chọn đề tài và công nghệ cho đồ án luôn là bước...

Liên Hệ
Liên hệ để được tư vấn & hỗ trợ đồ án CNTT nhé bạn!