ASCII art: dãy ký tự và vì sao độ sáng cần gamma

Ảnh thành ký tự thế nào, dãy ký tự là gì, vì sao lấy trung bình giá trị điểm ảnh làm chi tiết nhỏ tối đi, và độ sáng CIE L* sửa điều đó ra sao.

Trong bài này

ASCII art trông như đồ chơi, nhưng biến ảnh thành ký tự là một bài toán tái tạo sắc độ thật sự: hàng chục mức xám phải được ánh xạ vào vài ký tự sao cho kết quả vẫn giống bức ảnh. Phần lớn công cụ chuyển đổi làm sai một bước rất tinh vi, và tác phẩm ra lờ mờ. Bài này đi qua quy trình mà công cụ chuyển ảnh sang ASCII art dùng, với con số lấy từ chính mã của nó.

Quy trình

  1. Chia ảnh thành các ô, mỗi ô một ký tự.
  2. Đo độ sáng mỗi ô.
  3. Ánh xạ độ sáng vào dãy ký tự, từ đậm đến thưa.

Bước nào cũng có bẫy.

Bước 1: ô không vuông

Một ô ký tự đơn cách cao gần gấp đôi chiều rộng (tỉ lệ khoảng 0,5 với phần lớn phông: Menlo, Consolas và Courier đều gần như vậy). Nếu ảnh vuông vẽ 100 cột mà cũng 100 dòng, kết quả sẽ cao gấp đôi bản gốc. Vì vậy số dòng bằng số cột × (cao ÷ rộng của ảnh) × 0,5. Ảnh 400 × 200 ở 100 cột thành 100 × 25 ký tự.

Bước 2: lấy trung bình ánh sáng, không phải con số

Giá trị điểm ảnh trên màn hình được mã hóa gamma (sRGB): số 128 không có nghĩa là "một nửa ánh sáng của 255". Nó chỉ khoảng 22%, vì cách mã hóa dành nhiều con số hơn cho vùng tối, nơi mắt ta nhạy hơn. Đổi một giá trị sang ánh sáng thật ("tuyến tính") gần như là nâng lên lũy thừa 2,2.

Điều đó quan trọng ngay khi một ô chứa nhiều hơn một sắc độ, mà hầu như luôn vậy: chi tiết nhỏ, tóc, chữ, logo hòa sắc. Lấy một ô nửa điểm ảnh đen, nửa trắng.

  • Trung bình các số sRGB cho (0 + 255) / 2 = 127,5, một màu xám giữa.
  • Trung bình ánh sáng cho độ chói tương đối 0,5: một nửa ánh sáng của màu trắng, trông sáng hơn xám giữa rất nhiều.

Đứng xa một bàn cờ đen trắng, bạn thấy màu xám nhạt chứ không phải xám giữa. Con số thứ hai mới đúng.

Bước 3: ánh xạ theo độ sáng cảm nhận, không theo ánh sáng

Khi đã có ánh sáng (độ chói tương đối Y), còn cái bẫy thứ hai: đem Y ánh xạ thẳng vào dãy ký tự. Phản ứng của mắt với ánh sáng gần như là căn bậc ba, nên các bước đều nhau của Y không trông đều nhau. CIE L, thang độ sáng dùng trong khoa học màu sắc, sửa điều đó: L = 116 · Y^(1/3) − 16 (có một đoạn tuyến tính gần màu đen), từ 0 cho đen đến 100 cho trắng. Tấm thẻ xám 18%, màu xám giữa của nhiếp ảnh gia, có L* 49,5.

Ba cách đặt cạnh nhau

Với dãy 10 ký tự @%#*+=-:. (đậm đến thưa), đây là ký tự mỗi cách vẽ ra:

ÔTrung bình sRGB, ánh xạ nguyênTrung bình ánh sáng, ánh xạ theo YTrung bình ánh sáng, ánh xạ theo L*
xám phẳng 64#@#
xám phẳng 128=#=
xám phẳng 192:=:
½ đen, ½ trắng==:
¾ đen, ¼ trắng##=
¼ đen, ¾ trắng::.

Đọc bảng:

  • Ánh xạ thẳng độ chói Y (cột giữa) làm mọi sắc độ phẳng quá tối: xám 128 nhận dấu #, gần ký tự đậm nhất, vì độ chói của nó chỉ 0,216.
  • Ánh xạ nguyên số sRGB (cột đầu) xử lý tốt sắc độ phẳng vì sRGB vốn gần với cảm nhận, nhưng sai với mọi ô pha trộn: ô có một phần tư điểm ảnh trắng bị vẽ tối như xám phẳng 64.
  • Lấy trung bình ánh sáng rồi ánh xạ theo L* (cột cuối) đúng cả hai. Công cụ làm theo cách này.

Khác biệt nhìn thấy được nằm ở chi tiết nhỏ: sợi tóc, nét mảnh, chữ nhỏ và mép vật thể giữ được độ sáng thay vì chìm vào vùng tối.

Chọn dãy ký tự

Dãy ký tự là danh sách ký tự xếp theo lượng mực chúng chiếm trong ô.

  • 10 mức (@%#*+=-:. ) là kinh điển: rõ, dễ đọc, hợp với mọi phông.
  • 70 mức (dãy của Paul Bourke, bắt đầu bằng $@B%8&WM#*oahk…) cho nhiều sắc độ hơn, nhưng các ký tự liền nhau chênh rất ít mực, nên nó trông như họa tiết hơn là đổ bóng. Nó đẹp ở độ rộng lớn.
  • Khối Unicode █▓▒░ cho đổ bóng mượt chỉ với năm mức, nếu phông vẽ chúng đủ chiều cao.

Những lỗi hay gặp

  • Quá hẹp. Dưới khoảng 60 cột, khuôn mặt không còn nhận ra. Dùng 80 đến 120 để chia sẻ, nhiều hơn cho poster.
  • Quên màu nền. Trên terminal nền tối, phần sáng của ảnh phải nhận ký tự đậm: hãy đảo ngược ánh xạ.
  • Dán vào phông không đơn cách. ASCII art chỉ thẳng hàng với phông đơn cách. Trong ứng dụng chat, hãy dùng khối code.
  • Ảnh tương phản thấp. Phong cảnh sương mù chỉ ra ba ký tự. Tăng tương phản hoặc cắt sát chủ thể.
  • Thu nhỏ ảnh trước bằng phần mềm lấy trung bình trong sRGB. Việc đó đưa lại đúng hiện tượng tối đi mà cả quy trình này tránh; hãy đưa ảnh gốc cho công cụ chuyển đổi.

Thử ngay

Mở một ảnh chân dung trong công cụ chuyển ảnh sang ASCII art, đặt 100 cột và dãy 10 mức, rồi kéo thanh vùng trung tính (gamma): trên 1 làm tối giữa dãy, dưới 1 làm sáng. Nếu bạn cần màu thật của ảnh để làm bảng màu thay vì ký tự, công cụ lấy màu từ ảnh đọc chính xác từng màu.

Công cụ được nhắc trong bài

Về trang blog