CoreImage: bộ lọc và xử lý hình ảnh

Tác giả: IT Sectr Đã đăng: 2026-05-06 Thời gian đọc: 9 phút

CoreImage là framework của Apple dành cho xử lý hình ảnh và video thời gian thực, cung cấp hàng chục CIFilter tích hợp sẵn để hiệu chỉnh màu sắc, làm mờ, lớp phủ kết cấu và phát hiện. Theo Tài liệu Apple, CoreImage sử dụng GPU để xử lý pixel hiệu suất cao trên các thiết bị iOS. Framework hỗ trợ CIImage như một đối tượng hình ảnh bất biến và chuỗi bộ lọc để kết hợp các hiệu ứng mà không mất chất lượng.

Điểm chính

  • CoreImage — framework của Apple được tăng tốc GPU để xử lý hình ảnh và video trên iOS và macOS
  • CIFilter — khối xây dựng cơ bản với hơn 200 hiệu ứng tích hợp và hỗ trợ Metal shader tùy chỉnh
  • CIImage — đối tượng bất biến biểu diễn hình ảnh trong đường ống CoreImage mà không gắn với định dạng cụ thể
  • CIDetector — thành phần phát hiện khuôn mặt, văn bản, mã QR và hình chữ nhật trong ảnh
  • Xử lý GPU — CoreImage tự động sử dụng Metal hoặc OpenGL để tính toán song song trên GPU

CoreImage là gì

CoreImage là framework của Apple dành cho xử lý hình ảnh raster và video, lần đầu được giới thiệu trong macOS 10.4 Tiger và được chuyển sang iOS 5.0. Không giống Core Graphics hay UIKit, CoreImage hoạt động ở cấp độ pixel shader, sử dụng GPU cho các tính toán song song. Điều này cho phép áp dụng các hiệu ứng phức tạp — làm mờ, hiệu chỉnh màu, biến dạng — lên ảnh độ phân giải megapixel chỉ trong mili giây.

Kiến trúc CoreImage được xây dựng trên khái niệm đánh giá lười biếng (lazy evaluation): CIFilter không thực hiện xử lý cho đến khi render trong CIContext. Nhà phát triển xây dựng chuỗi nhiều CIFilter, kết nối đầu ra của một bộ lọc với đầu vào của bộ lọc khác và chỉ có lệnh gọi render mới khởi động đường ống GPU đầy đủ. Điều này giảm thiểu số lượt truyền qua card đồ họa và duy trì hiệu suất.

CoreImage hỗ trợ dải màu rộng (P3, sRGB, sRGB tuyến tính), ảnh HDR và làm việc với định dạng pixel 16 bit và 32 bit. Trên các thiết bị có Neural Engine, CoreImage có thể kết hợp shader GPU với Core ML để xử lý thông minh — ví dụ, hiệu chỉnh màu tự động dựa trên học máy, như được triển khai trong ứng dụng Ảnh trên iOS 17.

Kiến trúc CoreImage: CIImage, CIFilter, CIContext

Ba lớp chính tạo thành cốt lõi của CoreImage: CIImage (dữ liệu), CIFilter (thao tác) và CIContext (môi trường thực thi). Mỗi lớp chịu trách nhiệm cho giai đoạn đường ống riêng của mình và không trộn lẫn trách nhiệm.

CIImage — Nguồn bất biến

CIImage là một đối tượng nhẹ mô tả hình ảnh nhưng không trực tiếp chứa dữ liệu pixel. Nó có thể được tạo từ UIImage, CGImage, kết cấu Metal, kết cấu GL hoặc tệp trên đĩa. CIImage là bất biến — bất kỳ ứng dụng bộ lọc nào cũng tạo ra một CIImage mới mà không sửa đổi bản gốc. Điều này cho phép xây dựng chuỗi biến đổi mà không cần sao chép dữ liệu giữa các bước.

Một tính năng quan trọng: CIImage không bị ràng buộc với độ phân giải màn hình hoặc không gian màu cho đến khi render. CIImage tương tự có thể được render thành UIImage cho màn hình và thành tệp TIFF để in với các tham số khác nhau — CoreImage tự động thích ứng xử lý với ngữ cảnh đích.

CIFilter — Thao tác xử lý

CIFilter là lớp chính để áp dụng hiệu ứng. Mỗi CIFilter là một chương trình shader với các tham số đầu vào (inputImage, inputIntensity, inputRadius, v.v.) và một hình ảnh đầu ra. Apple cung cấp hơn 200 CIFilter tích hợp, được nhóm theo danh mục: CICategoryColorEffect (hiệu chỉnh màu), CICategoryBlur (làm mờ), CICategoryStylize (cách điệu), CICategoryGeometryAdjust (biến đổi hình học).

Để tạo CIFilter tùy chỉnh, nhà phát triển viết một Metal shader (CIKernel) — một fragment shader trong Metal Shading Language xử lý từng pixel một cách độc lập. Sau khi biên dịch, shader được đăng ký dưới dạng lớp con của CIFilter và có thể được sử dụng trong chuỗi cùng với các bộ lọc tích hợp của Apple.

Danh mụcVí dụ bộ lọcMục đích
ColorEffectCIColorControlsĐộ sáng, độ tương phản, độ bão hòa
BlurCIGaussianBlurLàm mờ Gaussian với bán kính có thể điều chỉnh
StylizeCIPixellatePixel hóa với tỷ lệ xác định
GeometryAdjustCIAffineTransformXoay, tỷ lệ, dịch chuyển qua ma trận affine
CompositeCISourceOverCompositingKết hợp hình ảnh với kênh alpha

CIContext — Môi trường render

CIContext là một đối tượng nặng quản lý việc phân bổ tài nguyên GPU, biên dịch shader và đệm. Tạo CIContext là một thao tác tốn kém, vì vậy Apple khuyên bạn nên tạo nó một lần trong suốt vòng đời ứng dụng và tái sử dụng. Ngữ cảnh được liên kết với một GPU (Metal, OpenGL) hoặc CPU cụ thể và xác định không gian màu của hình ảnh đầu ra.

CIFilter: bộ lọc tích hợp và Metal shader tùy chỉnh

Thư viện CIFilter không ngừng mở rộng: iOS 17 đã thêm các bộ lọc mới cho xử lý HDR và học máy. Tất cả các bộ lọc tích hợp đều được ghi lại trong Tài liệu dành cho nhà phát triển Apple và có thể được tìm kiếm theo danh mục hoặc tên. Để khám phá các bộ lọc có sẵn trên thiết bị, hãy sử dụng CIFilter.filterNames(inCategory:).

Chuỗi nhiều bộ lọc

Khả năng chính của CoreImage là kết hợp nhiều CIFilter thành một chuỗi. Đầu ra của một bộ lọc được đưa vào đầu vào của bộ lọc khác thông qua tham số inputImage. CoreImage tối ưu hóa chuỗi ở giai đoạn render: các bộ lọc liền kề hoạt động trong cùng không gian màu được kết hợp thành một lượt GPU duy nhất (kernel fusion). Điều này mang lại lợi ích về hiệu suất mà không cần sự can thiệp của nhà phát triển.

Bộ lọc tùy chỉnh qua CIKernel

Để tạo hiệu ứng tùy chỉnh, nhà phát triển viết một hàm Metal với chú thích [[kernel]]. Hàm nhận tọa độ pixel và trả về màu sắc. CoreImage truyền shader đến GPU, nơi nó được thực thi song song cho tất cả các pixel của hình ảnh. Các bộ lọc tùy chỉnh đặc biệt hữu ích cho các hiệu ứng trực quan độc đáo: ảnh màu nâu với đường cong phi tuyến, làm mờ phân tán hoặc mô phỏng hạt phim.

metal
#include <CoreImage/CoreImage.h>

[[kernel]] float4 customFilter(sample_t s, float intensity) {
    float4 result;
    result.rgb = s.rgb * (1.0 - intensity) + s.r * intensity;
    result.a = s.a;
    return result;
}

Hiệu suất và bộ nhớ đệm

CoreImage tự động quản lý bộ nhớ đệm của các kết quả trung gian. Nếu cùng một chuỗi bộ lọc được áp dụng cho các hình ảnh khác nhau, CoreImage có thể tái sử dụng các shader đã biên dịch. Để có hiệu suất tối đa, hãy tránh tạo CIContext cho mỗi khung hình — sử dụng một ngữ cảnh duy nhất và đặt lại các tham số đầu vào của bộ lọc.

CIDetector: phát hiện khuôn mặt, văn bản và đối tượng

CIDetector là một hệ thống con của CoreImage để phát hiện các đối tượng ngữ nghĩa trong ảnh mà không cần sử dụng Vision hoặc Core ML. CIDetector hỗ trợ bốn loại phát hiện: khuôn mặt (CIDetectorTypeFace), văn bản (CIDetectorTypeText), mã QR (CIDetectorTypeQRCode) và hình chữ nhật (CIDetectorTypeRectangle). Bộ phát hiện hoạt động trên CPU với tối ưu hóa cho các lệnh NEON, đảm bảo tốc độ ổn định trên các thiết bị không có GPU mạnh.

Phát hiện khuôn mặt

Bộ phát hiện khuôn mặt CIDetectorTypeFace trả về một mảng CIFaceFeature với tọa độ ranh giới khuôn mặt, vị trí mắt và miệng. Kể từ iOS 12, CIDetector cũng phát hiện nụ cười (hasSmile) và vị trí mắt trái/phải (leftEyeClosed, rightEyeClosed). Độ chính xác phát hiện đủ cho hầu hết các ứng dụng AR và ảnh, nhưng đối với các tình huống quan trọng, Apple khuyên dùng Vision.framework.

Phát hiện hình chữ nhật

CIDetectorTypeRectangle tìm các vùng hình chữ nhật trong ảnh — tài liệu, danh thiếp, màn hình thiết bị. Bộ phát hiện trả về CIRectangleFeature với bốn điểm tạo thành đường viền hình chữ nhật. Theo WWDC 2024, bộ phát hiện hình chữ nhật sử dụng cùng kiến trúc mạng nơ-ron như Vision, nhưng với mức tiêu thụ bộ nhớ thấp hơn. Điều này làm cho nó được ưa tiên cho xử lý luồng khung hình thời gian thực, ví dụ, trong các ứng dụng máy quét tài liệu.

Ví dụ mã: bộ lọc và phát hiện trong Swift

Các ví dụ thực tế sẽ giúp củng cố hiểu biết về CoreImage. Hãy xem xét hai kịch bản điển hình: áp dụng bộ lọc màu cho ảnh và phát hiện khuôn mặt với vẽ khung bao quanh.

Áp dụng ảnh màu nâu cho hình ảnh

Một ví dụ cơ bản về bộ lọc CISepiaTone, chuyển đổi hình ảnh màu thành tông màu nâu. Bộ lọc chấp nhận tham số inputIntensity từ 0 (bản gốc) đến 1 (hiệu ứng tối đa). Lưu ý đánh giá lười biếng: CIImage được trả về bởi filter.outputImage không chứa pixel — việc render chỉ xảy ra khi context.createCGImage được gọi.

swift
import CoreImage

guard let inputImage = CIImage(image: uiImage) else { return }
let filter = CIFilter(name: "CISepiaTone")
filter?.setValue(inputImage, forKey: kCIInputImageKey)
filter?.setValue(0.8, forKey: kCIInputIntensityKey)

let context = CIContext()
let outputImage = filter?.outputImage
let cgImage = context.createCGImage(outputImage!, from: inputImage.extent)
let resultImage = UIImage(cgImage: cgImage!)

Phát hiện khuôn mặt với vẽ khung bao quanh

Ví dụ sau đây sử dụng CIDetector để tìm khuôn mặt trong ảnh và vẽ hình chữ nhật xung quanh mỗi khuôn mặt được phát hiện. CIFaceFeature chứa tọa độ trong hệ tọa độ hình ảnh (gốc ở góc dưới bên trái), vì vậy khi vẽ trên UIKit, cần chuyển đổi tọa độ thông qua phép biến đổi affine.

swift
let detector = CIDetector(
    ofType: CIDetectorTypeFace,
    context: context,
    options: [CIDetectorAccuracy: CIDetectorAccuracyHigh]
)
let features = detector?.features(in: inputImage) as? [CIFaceFeature]

for face in features ?? [] {
    print("Face bounds: \(face.bounds)")
    if face.hasSmile {
        print("Người đó đang mỉm cười")
    }
}

Kết hợp nhiều hiệu ứng

Ví dụ cuối cùng minh họa chuỗi ba bộ lọc: hiệu chỉnh màu, làm mờ ảnh và lớp phủ kết cấu. Lưu ý rằng outputImage của bộ lọc đầu tiên được truyền dưới dạng inputImage cho bộ lọc thứ hai — mà không có render trung gian. Khi createCGImage được gọi, CoreImage kết hợp cả ba thao tác thành một lượt GPU duy nhất.

swift
let colorFilter = CIFilter(name: "CIColorControls")
colorFilter?.setValue(inputImage, forKey: kCIInputImageKey)
colorFilter?.setValues([
    kCIInputBrightnessKey: 0.1,
    kCIInputContrastKey: 1.2
])

let vignetteFilter = CIFilter(name: "CIVignette")
vignetteFilter?.setValue(colorFilter?.outputImage, forKey: kCIInputImageKey)
vignetteFilter?.setValue(2.0, forKey: "inputRadius")

let finalImage = vignetteFilter?.outputImage
let result = context.createCGImage(finalImage!, from: inputImage.extent)

Câu hỏi thường gặp

CoreImage khác Core Graphics ở điểm nào

CoreImage chạy trên GPU và được tối ưu cho các thao tác pixel (bộ lọc, hiệu chỉnh màu), trong khi Core Graphics là thư viện CPU cho vẽ vector và ngữ cảnh 2D. CoreImage nhanh hơn cho xử lý hàng loạt ảnh, Core Graphics chính xác hơn cho vẽ giao diện từng bước.

Có thể áp dụng CoreImage cho video thời gian thực không

— CoreImage hỗ trợ xử lý các khung hình video riêng lẻ thông qua AVPlayerItemVideoOutput hoặc AVCaptureOutput. Để xử lý luồng, hãy sử dụng AVVideoComposition với CIFilter, cho phép áp dụng hiệu ứng mà không cần sao chép khung hình giữa CPU và GPU.

CoreImage sử dụng hồ sơ màu nào theo mặc định

CoreImage theo mặc định làm việc trong không gian màu làm việc sRGB (kCGColorSpaceSRGB). Khi tạo CIContext, bạn có thể chỉ định một không gian thay thế — sRGB tuyến tính mở rộng cho HDR hoặc Display P3 cho màn hình dải màu rộng.

Có thể kết hợp bao nhiêu bộ lọc CIFilter trong một chuỗi

Không có giới hạn về số lượng bộ lọc trong một chuỗi, nhưng cứ mỗi 5–7 bộ lọc liên tiếp sẽ tạo thêm một lượt GPU. Đối với hơn 10 bộ lọc, bạn nên chia chuỗi thành các nhóm và render kết quả trung gian để tránh vượt quá giới hạn thanh ghi shader.

CIDetector có hoạt động trên thiết bị không có Neural Engine không

— CIDetector hoạt động trên CPU sử dụng các lệnh NEON trên tất cả các thiết bị chạy iOS 5.0 trở lên. Độ chính xác phát hiện là như nhau trên tất cả các thiết bị, nhưng tốc độ cao hơn trên chip Apple A12+ nhờ tăng tốc phần cứng mạng nơ-ron.

Tổng kết

  • CoreImage — framework của Apple được tăng tốc GPU để xử lý hình ảnh và video trên iOS và macOS
  • CIImage, CIFilterCIContext tạo thành kiến trúc ba lớp với đánh giá lười biếng
  • Hơn 200 CIFilter tích hợp bao phủ hầu hết các tác vụ hiệu chỉnh màu, làm mờ và cách điệu
  • Bộ lọc tùy chỉnh được tạo qua Metal CIKernel với chú thích [[kernel]]
  • CIDetector tìm khuôn mặt, văn bản, mã QR và hình chữ nhật mà không cần Vision.framework
  • Chuỗi bộ lọc được tự động tối ưu hóa qua kernel fusion thành một lượt GPU duy nhất
  • Để xử lý video thời gian thực, hãy sử dụng AVVideoComposition với CIFilter

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm