Hiệu ứng pastel thường bị hiểu lầm là chỉ đơn giản giảm độ bão hòa và tăng độ sáng, nhưng thực chất nó dựa trên cơ chế tái bản không tuyến tính của không gian màu CIELAB trong Midjourney V6.1. Hãy cùng tìm hiểu cách mô phỏng phản ứng tán xạ ánh sáng của lớp nhũ tương trên phim Agfa Vista 100.
Mô Hình Hóa Không Gian Màu CIELAB
Không gian màu Lab được xử lý bằng các bước sau:
- L* giá trị được biến đổi thành: L' = 75 + 25 × tanh((L* − 50) / 30), làm mềm chuyển tiếp giữa các mức xám trung bình.
- Tọa độ a*b* được chiếu vào một elip với tâm ở (10, -8), bán trục lớn 32 và bán trục nhỏ 18, hạn chế sự lệch màu cao.
- Sau khi xuất hình ảnh, hệ thống áp dụng biến đổi gamma ngược theo chuẩn sRGB IEC61966-2-1 để đảm bảo hiển thị chính xác cảm giác "sương mù" trên màn hình.
Hướng Dẫn Ba Bước Để Tạo Hiệu Ứng Pastel
- Thêm tham số `--style raw --stylize 500` vào cuối chuỗi lệnh để kích hoạt chế độ đường dẫn màu trực tiếp.
- Nạp cấu hình màu cụ thể: `color_profile: Fuji_Superia_Pastel_v3.icc` (tải trước lên tài nguyên MJ).
- Xử lý lại màu bằng mã Python dưới đây:
# Sử dụng OpenCV để tái bản màu
import cv2, numpy as np
lab = cv2.cvtColor(img, cv2.COLOR_RGB2LAB)
l, a, b = cv2.split(lab)
l = 75 + 25 * np.tanh((l.astype(np.float32) - 50) / 30)
a_b_centered = np.stack([a - 12, b + 10], axis=-1)
dist = np.linalg.norm(a_b_centered, axis=-1)
scale = np.clip(34 / (dist + 1e-6), 0, 1)
a = 12 + a_b_centered[...,0] * scale
b = -10 + a_b_centered[...,1] * scale
lab_remap = cv2.merge([l.astype(np.uint8), a.astype(np.uint8), b.astype(np.uint8)])
img_pastel = cv2.cvtColor(lab_remap, cv2.COLOR_LAB2RGB)
So Sánh Sự Khác Biệt Giữa Phiên Bản V6.1 Và V6.0
| Đặc điểm | V6.0 Mặc Định | V6.1 Hiệu Ứng Pastel |
|---|---|---|
| Khoảng động L* | Gấp khúc tuyến tính (0–100→15–85) | Bản đồ hyperbolic (75±25) |
| Hạn chế a*b* | Cắt góc chữ nhật (±45) | Hình elip (tỷ lệ trục chính ≈1.78:1) |
| Điểm trắng thích nghi | Cố định D65 | Tự động khớp ICC D50 |
Phân Tích Cơ Sở Khoa Học Màu Sắc Trong Midjourney V6.1
CIELAB là không gian màu đồng nhất về mặt cảm nhận, cho phép tránh sự sai lệch ngữ nghĩa do ánh sáng và màu sắc kết hợp trong RGB. Mô hình này sử dụng hàm mất mát ΔEab để đo độ khác biệt màu sắc.
def delta_e_ab_loss(pred_lab, target_lab):
delta_L = pred_lab[:, 0] - target_lab[:, 0]
delta_a = pred_lab[:, 1] - target_lab[:, 1]
delta_b = pred_lab[:, 2] - target_lab[:, 2]
return torch.mean(torch.sqrt(delta_L**2 + delta_a**2 + delta_b**2))
Chức Năng Gamma Phi Tuyến Tính
sRGB và Rec.709 đều sử dụng hàm Gamma phân đoạn, bao gồm đoạn tuyến tính (độ sáng thấp) và đoạn luật mũ (độ sáng cao). Hàm tái bản màu phải phù hợp với phản ứng cảm nhận của mắt người.
def srgb_oetf(v_linear):
v = np.clip(v_linear, 0.0, 1.0)
return np.where(v <= 0.0031308,
12.92 * v,
1.055 * (v ** (1/2.4)) - 0.055)
Thiết Lập LUT Cho Phản Hồi Phim Nhiếp Ảnh
Phản hồi của Kodak Portra 160 có thể được biểu diễn qua LUT 3D và tích hợp vào bộ đệm hằng số shader GPU để tối ưu hóa hiệu suất.
// Shader Vulkan lấy mẫu LUT phim
layout(set = 0, binding = 1) uniform sampler3D uFilmLUT;
vec3 applyPortra160(vec3 linearRGB) {
vec3 norm = clamp(linearRGB, 0.0, 1.0);
return texture(uFilmLUT, norm).rgb; // Nội suy tự động
}