Image Inpainting
Image inpainting lấp đầy các vùng bị che, hư hỏng hoặc xóa khỏi ảnh bằng nội dung hợp lý, sử dụng phương pháp cổ điển, dựa trên patch, GAN hoặc diffusion.
Inpainting ảnh là tác vụ lấp đầy một vùng được che trong ảnh, chẳng hạn vết xước, đối tượng bị xóa hoặc mảng ảnh bị khuyết, bằng nội dung hòa hợp với vùng xung quanh. Mỗi phương pháp nhận hai đầu vào: ảnh và mask nhị phân đánh dấu các pixel cần thay thế; mọi thứ bên ngoài mask được giữ nguyên. Thuật ngữ này bắt nguồn từ việc bảo tồn nghệ thuật, nơi người phục chế sửa lại các bức tranh bị hư hại. Tại SIGGRAPH 2000, Marcelo Bertalmío, Guillermo Sapiro, Vicent Caselles và Coloma Ballester đưa inpainting vào lĩnh vực thị giác máy tính với một phương pháp kéo dài các đường có độ sáng bằng nhau từ rìa vùng khuyết vào bên trong vùng đó. Các pixel bên dưới mask không được biết, vì vậy vùng được inpaint luôn là phần tái tạo có vẻ hợp lý, chứ không phải khôi phục chính xác nội dung ban đầu.
Các phương pháp cổ điển, dựa trên patch và học được#
Các phương pháp cổ điển lan màu sắc và cạnh từ ranh giới của mask vào phía trong. OpenCV cung cấp hai phương pháp trong module inpainting: phương pháp lan truyền nhanh năm 2004 của Alexandru Telea (cv2.INPAINT_TELEA) và phương pháp Navier-Stokes năm 2001 của Bertalmío, Andrea Bertozzi và Sapiro (cv2.INPAINT_NS). Các phương pháp này hoạt động tốt với bụi, vết xước và lớp phủ văn bản mảnh, nhưng tạo thành vùng nhòe trên các lỗ lớn. Đoạn mã dưới đây áp dụng phương pháp của Telea cho cùng số pixel bị khuyết theo hai cách: một lần dưới dạng các vết xước mảnh và một lần dưới dạng một hình vuông duy nhất:
import cv2
import numpy as np
from skimage import data
image = cv2.cvtColor(data.astronaut(), cv2.COLOR_RGB2BGR) # 512x512 sample photo
# Two masks with about the same pixel count: thin scratches and one solid block
scratches = np.zeros(image.shape[:2], np.uint8)
for y in range(40, 512, 40):
cv2.line(scratches, (0, y), (511, y + 30), 255, thickness=2)
block = np.zeros_like(scratches)
side = int(np.sqrt(np.count_nonzero(scratches)))
block[200 : 200 + side, 200 : 200 + side] = 255
for name, mask in [("scratches", scratches), ("block", block)]:
restored = cv2.inpaint(image, mask, 3, cv2.INPAINT_TELEA)
# Mean error inside the mask, where every pixel was reconstructed
error = np.abs(restored.astype(int) - image.astype(int))[mask > 0].mean()
print(f"{name}: {np.count_nonzero(mask)} masked pixels, mean error {error:.1f} gray levels")Đoạn mã in ra sai số trung bình 9.1 mức xám trên 18,432 pixel vết xước và 36.5 trên một vùng khối 18,225 pixel. Mỗi pixel thuộc vết xước đều có các pixel lân cận đã biết cách đó một hoặc hai pixel, trong khi tâm vùng khối cách pixel thực gần nhất 67 pixel; vì vậy, cùng một diện tích bị khuyết lại gây ra sai số gấp bốn lần.
Các phương pháp dựa trên patch sao chép texture từ nơi khác trong ảnh thay vì làm mịn vùng khuyết. Thuật toán dựa trên exemplar năm 2004 của Antonio Criminisi, Patrick Pérez và Kentaro Toyama lấp lỗ theo từng patch, bắt đầu từ nơi các cạnh mạnh đi vào vùng khuyết; thuật toán tìm kiếm patch gần nhất PatchMatch của Connelly Barnes và cộng sự (2009) giúp phương pháp này đủ nhanh để sử dụng tương tác và là nền tảng cho Content-Aware Fill của Photoshop. Các phương pháp patch hoạt động xuất sắc với cỏ, gạch và bầu trời, nhưng thất bại khi nội dung bị khuyết không xuất hiện ở nơi nào khác trong ảnh.
Các model được huấn luyện suy luận nội dung dựa trên những gì chúng đã thấy trong quá trình huấn luyện. Context Encoders của Deepak Pathak và cộng sự (CVPR 2016) huấn luyện một mạng nơ-ron tích chập bằng hàm mất mát đối kháng, lấy ý tưởng từ mạng đối sinh đối kháng, để hoàn thiện vùng trung tâm bị che. LaMa của Samsung AI (WACV 2022) sử dụng các phép tích chập Fourier nhanh, có trường tiếp nhận bao phủ toàn bộ ảnh ngay từ layer đầu tiên, đồng thời được huấn luyện với các mask ngẫu nhiên lớn, nhờ đó có thể hoàn thiện các lỗ lớn và cấu trúc lặp như hàng rào và cửa sổ. Các model khuếch tán lấp lỗ bằng cách khử nhiễu có điều kiện theo các pixel nhìn thấy và, tùy chọn, theo prompt: các checkpoint inpainting của Stable Diffusion bổ sung năm kênh đầu vào cho U-Net để chứa mask và latent của ảnh đã bị che; còn RePaint của Andreas Lugmayr và cộng sự (CVPR 2022) sử dụng model khuếch tán không chỉnh sửa, thay vùng đã biết bằng bản sao gốc đã thêm nhiễu ở mỗi bước. Generative Fill của Adobe đưa tính năng inpainting chuyển văn bản thành ảnh dựa trên prompt vào Photoshop năm 2023.
Mask và xóa đối tượng#
Xóa đối tượng là quy trình phân đoạn ảnh rồi inpainting: mask chọn đối tượng, còn inpainting lấp lỗ mà đối tượng để lại. Mask được vẽ sát quanh đối tượng vẫn để lại các pixel ở rìa, bóng đổ và phản chiếu như bóng ma, vì vậy người chỉnh sửa thường giãn mask thêm vài pixel và mở rộng mask phủ qua cả bóng đổ. Phân đoạn instance tạo một mask cho mỗi đối tượng, nên đây thường là nguồn cung cấp mask để xóa đối tượng; các model có thể điều khiển bằng prompt như SAM 2 của Meta chuyển một cú nhấp thành mask cho những đối tượng không thuộc danh sách lớp nào. Các model phân đoạn YOLO26 trả về đường viền của từng đối tượng dưới dạng polygon trong result.masks.xy; cv2.drawContours rasterize polygon đó cùng với cv2.FILLED thành mask inpainting, giống bước được sử dụng trong hướng dẫn tách đối tượng bằng phân đoạn.
Inpainting video bổ sung yếu tố thời gian: vùng được lấp phải nhất quán giữa các frame nếu không sẽ bị nhấp nháy, vì vậy các công cụ chỉnh sửa video bằng AI lan truyền mask bằng tracking và tận dụng các pixel nền lộ ra trong những frame lân cận khi camera di chuyển.
Các tác vụ liên quan#
- Outpainting: Sử dụng cùng các model để mở rộng ảnh vượt ra ngoài đường viền ban đầu, trong đó vùng canvas mới là mask.
- Siêu phân giải: Bổ sung chi tiết trên toàn ảnh ở độ phân giải cao hơn mà không cần mask.
- Khử nhiễu: Loại bỏ nhiễu phân bố trên mọi pixel trong khi vẫn giữ nguyên cảnh, cũng không cần mask.
- Nội suy frame: Tổng hợp toàn bộ các frame trung gian của video từ những frame ở hai phía.
Ứng dụng và nguồn gốc dữ liệu#
Khôi phục ảnh dùng mask để xử lý vết nứt, bụi và vết rách trên ảnh in được quét; khôi phục phim cũng làm tương tự theo từng frame để xử lý vết xước trên tư liệu lưu trữ. Chỉnh sửa ảnh và chụp ảnh sản phẩm loại bỏ các vật thể thừa, đường dây điện và khuyết điểm. Trong phân tích ảnh vệ tinh, lấp vùng trống là một bài toán inpainting kinh điển: bộ hiệu chỉnh dòng quét trên Landsat 7 bị lỗi vào ngày 31 tháng 5 năm 2003, để lại các sọc hình nêm bao phủ khoảng 22 phần trăm mỗi cảnh được chụp sau đó.
Inpainting bằng model được huấn luyện được đánh giá trên các ảnh giữ lại với mask tổng hợp, sử dụng Khoảng cách Inception Fréchet (FID) để đo tính chân thực, vì kết quả lấp tốt có thể khác các pixel gốc mà vẫn chính xác. Tính chân thực này cũng khiến inpainting trở thành công cụ tạo deepfake và xóa watermark; trong ảnh y tế, khoa học hoặc pháp y, cấu trúc được bịa ra có thể làm thay đổi chẩn đoán hoặc phán quyết. Content Credentials ghi lại những chỉnh sửa như vậy trong metadata có chữ ký, và Adobe đính kèm metadata này vào ảnh được chỉnh sửa bằng Generative Fill.










