Thuật toán nào tôi có thể sử dụng để mô phỏng hiệu ứng bokeh?


12

Tôi đang cố gắng viết một tập lệnh lặp qua từng pixel trong một bức ảnh và áp dụng hiệu ứng xóa phông cho toàn bộ hình ảnh.

Tôi đã xây dựng một kịch bản dựa trên liên kết này , tuy nhiên đó có vẻ là một hack.

Tôi có ba hình ảnh đầu vào: bản đồ độ sâu đen trắng, ảnh và hình ảnh "cọ" (hiện đang là hình lục giác). Đối với mỗi pixel của bức ảnh, tôi đóng dấu bàn chải để nó được căn giữa vào pixel đó và màu của pixel đó.

Nó trông ... ổn trên các bàn chải nhỏ xíu, nhưng một khi tôi tăng kích thước của bàn chải Boong thì cuối cùng nó trông giống như mờ gaussian. Dưới đây là hình ảnh về thời gian vuông bị làm mờ với thuật toán của tôi:

nhập mô tả hình ảnh ở đây

Không bao giờ bỏ qua các cạnh tối, tôi có thể khắc phục điều đó.

Bạn có thể sắp xếp nó khác với gaussian, nhưng nó vẫn còn rất xa so với thứ có thể được gọi là hiệu ứng bokeh, với các cạnh sắc nét:

nhập mô tả hình ảnh ở đây

Tôi hiểu lý do tại sao thuật toán của tôi thực hiện những gì nó làm ... làm thế nào tôi có thể mô phỏng chính xác hơn một hiệu ứng bokeh?



@Imre Tôi hiểu sự khác biệt và Bokeh thường được gây ra bởi một ống kính và Gaussian do xử lý hậu kỳ, nhưng tôi muốn mô phỏng Bokeh.
Thực thể

@Entity: Làm cách nào để tìm hình ảnh mẫu với bản đồ độ sâu chính xác? Là của bạn chính xác? Tôi muốn thử bản thân mình (sau trận chung kết). Có lẽ tôi sẽ đưa ra câu trả lời trong một vài tuần sau đó. Nếu bạn là công khai, tôi có thể có một liên kết đến nó?
Martijn Courteaux

@MartijnCourteaux Đối với thử nghiệm ban đầu của tôi, tôi chỉ sử dụng bản đồ độ sâu phẳng để mọi thứ đều mờ. Đối với hình học đơn giản (ví dụ như một chiếc cốc trên bàn) tôi nghĩ rằng nó sẽ khá đơn giản để tạo ra một bản đồ độ sâu đẹp. Đối với hình ảnh phức tạp hơn, có lẽ bạn sẽ cần một bản đồ độ sâu thực sự. Điều này có thể được tính từ hai hình ảnh, hoặc thậm chí chỉ từ hình ảnh duy nhất của bạn .
Thực thể

Câu trả lời:


20

Tôi nghĩ vấn đề chính là một trong các phạm vi động, thuật toán của bạn có thể đúng nhưng bạn đang làm việc với loại dữ liệu sai.

Một nguồn sáng điểm khác có thể cắt và chuyển sang màu trắng tinh khiết được lan truyền trên một diện tích lớn hơn bằng một thấu kính không định hướng, để nó tạo thành một đĩa không sáng và do đó không phải là clip.

Đó là lý do tại sao bạn có được những vòng tròn đẹp đó trong hình ảnh thực tế của bạn. Nếu bạn cắt tín hiệu (làm cho nó kém sáng hơn so với mức khác và sau đó lan truyền nó ra bằng mô phỏng Bo mạch của bạn, bạn sẽ có một vòng tròn mờ (hoặc hình lục giác, hoặc bất cứ thứ gì) không nổi bật và do đó trông không thực tế.

Những gì bạn có trong một chuỗi hình ảnh thực sự là:

bokeh (from the lens) -> digitisation (clipping) -> gamma correction & dynamic range compression

Những gì bạn đang làm là

sharp image -> digitisation (clipping) -> gamma correction & dynamic range compression -> bokeh simulation

Bạn sẽ không nhận được kết quả chính xác vì bạn không làm việc với dữ liệu tuyến tính.

Những gì bạn có thể làm là cố gắng tuyến tính hóa dữ liệu, thay thế bất kỳ phạm vi động nào đã bị mất để cắt, thực hiện mô phỏng Bo mạch của bạn và sau đó làm lại các hoạt động phi tuyến!

Đây là một ví dụ. Tôi đã bắt đầu với một hình ảnh HDR đã được bổ sung, cho kết quả phi tuyến cao. Đây là loại hình ảnh tồi tệ nhất để thử mô phỏng hiệu ứng với!

Thực hiện thao tác tích chập tiêu chuẩn để mô phỏng hiệu ứng bokeh (sử dụng công cụ làm mờ ống kính của photoshop) mang lại kết quả này, rất giống với những gì bạn đang nhận được:

Để có được kết quả tốt hơn, tôi đã áp dụng một đường cong cực đoan để thử và đưa hình ảnh trở lại gần như những gì nó đã có trước khi tô màu, trong đó các điểm nổi bật là nhiều, sáng hơn nhiều so với phần còn lại của hình ảnh. Tôi đã làm điều này bằng công cụ cấp độ, đẩy đầu vào trung tâm một bước dài sang phải, từ 1.0 đến khoảng 0.2). Sau đó, tôi áp dụng công cụ làm mờ ống kính, giống như trước đây. Cuối cùng tôi áp dụng một đường cong cực đoan theo hướng ngược lại với đường cong đầu tiên. Kết quả, trong khi một chặng đường dài từ hoàn hảo, trông giống như hiệu ứng ống kính thực tế hơn:

 

Nếu bạn đang thực hiện mã này, sau đó thử lập phương cho từng giá trị, sau đó áp dụng thói quen mô phỏng hiệu ứng Bo mạch của bạn, sau đó lấy gốc khối của mỗi giá trị. Bạn sẽ thấy một sự cải thiện. Nó có thể mất một số điều chỉnh.

tl; dr ngay cả khi bạn đã thực hiện một mô hình toán học hoàn hảo về hiệu ứng bokeh, nó phải được áp dụng trên dữ liệu tuyến tính không bị cắt. Nếu bạn áp dụng các tính toán tương tự cho dữ liệu được sửa đổi nhiều (ngay cả một tiêu chuẩn trong máy ảnh JPEG cũng được sửa đổi nhiều theo quan điểm toán học), bạn sẽ nhận được một kết quả rất khác.


12

Trước hết, trong quang học, chỉ có ánh sáng cộng lại và bóng tối thì không. Đảm bảo rằng thuật toán của bạn không làm chảy các pixel tối ra bên ngoài vị trí ban đầu của chúng. Các pixel kết quả sẽ khá giống với các pixel nguồn gần đó hơn mức trung bình. Hoặc, chính xác hơn nữa, bạn sẽ tổng hợp các logarit ảnh hưởng đến các pixel nguồn.

Một nguyên nhân có thể khác khiến các cạnh của bạn có thể không sắc nét là nếu các cạnh của mặt nạ của bạn không sắc nét. Hoạt hình trong trang bạn cung cấp làm tham chiếu có thể bị hiểu nhầm để trong mặt nạ, pixel gốc sáng và các ảnh khác dần tối hơn. Điều này cũng sẽ chuyển thành các cạnh bùn trong tính toán hiệu ứng. Trong nhiếp ảnh, khẩu độ có các cạnh xác định, không phải là dần dần. Vì vậy, thực tế hầu hết các pixel trong mặt nạ phải có độ sáng bằng nhau và chỉ các cạnh (trong đó ít hơn một pixel nên được tô màu cho một đường thẳng) có thể có một chút màu xám.

Bạn cũng đề cập đến việc có một bản đồ độ sâu, nhưng không có từ nào về việc sử dụng nó. Kích thước mặt nạ Boong của bạn phải tương quan với độ sâu pixel và chênh lệch độ sâu của mặt phẳng tiêu cự - một pixel càng xa mặt phẳng tiêu cự (theo một trong hai hướng), mặt nạ của nó càng lớn. Ở mặt phẳng tiêu cự, kích thước mặt nạ phải là 1 × 1 pixel.


Với điều kiện là tất cả các phụ gia, bạn sẽ không gặp phải vấn đề về các vùng tối lan rộng ra. Đúng là bạn cần một mặt nạ sắc nét để có được các vòng tròn sắc nét, nhưng vấn đề chính là hoạt động của anh ấy đang được áp dụng cho dữ liệu phi tuyến tính.
Matt Grum
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.