2010-10-30 11 views
10

Tôi biết rằng không thể triển khai thuật toán Floyd–Steinberg dithering với trình đổ bóng pixel vì thuật toán đó hoàn toàn tuần tự. Nhưng có lẽ có tồn tại một số thuật toán phối màu song song higly mà bởi đầu ra thị giác của nó tương tự như thuật toán Floyd-Steinberg? Vì vậy, câu hỏi là - Thuật toán phối màu là gì phù hợp để thực hiện trên pixel shader (tốt nhất là GLSL) và với chất lượng đầu ra (rất) tương tự như phối màu Floyd-Steinberg?Lựa chọn thay thế phối màu Floyd – Steinberg cho pixel shader

BTW. Các thuật toán multi-pass được cho phép cho đến khi không có nhiều hơn 2 pass và chi phí CPU giữa các pass là nhỏ.

Bất kỳ ý tưởng nào?

CHỈNH SỬA:
Tôi cần phối màu từ màu 24-bit thành màu 21 bit.
(Tức là -. Tôi cần phải chuyển đổi từ 8 bit/kênh đến 7 bit/kênh)

EDIT 2 Có lẽ tôi đã không được giải thích vấn đề rất tốt. Vì vậy, tôi sẽ cố gắng mở rộng một chút về vấn đề chính xác. Vấn đề là thế này - xem xét chúng ta có bức tranh này:
alt text
Và chúng tôi có trên hình ảnh, nhưng xử lý bằng dithering thuật toán:
alt text
Bây giờ đây là thủ tục mà sẽ kiểm tra dither của bạn được tốt cho tôi hay không:
1. Tải các ảnh này trong Photoshop dưới dạng một ảnh có 2 lớp.
2. Chọn chế độ hòa trộn Lớp thành "Sự khác biệt".
3. Thực hiện thao tác "Hợp nhất hiển thị" trên các lớp, để chỉ có một lớp.
4. Thực hiện thao tác => Hình ảnh/Adjustments/Equalize

Sau đó bạn phải có được hình ảnh như:
alt text
Như bạn thấy - pixel giữa đó là màu đỏ đơn điệu không dithered ở tất cả. Ngoài ra, phối màu của các vùng hình ảnh trái và phải có một chút khác biệt. Cố gắng xây dựng lại thuật toán phối màu với hành vi như vậy.

+0

Tôi đang gặp khó khăn khi hiểu kết quả của bạn. Hình ảnh khác biệt ngụ ý đầu ra Floyd-Steinberg của bạn chứa các thành phần có giá trị 0 và 255, nhưng điều này không có ý nghĩa với 7 bit; nó phải là 0 và 254, hoặc 1 và 255. Trừ khi bạn đang sử dụng các màu sắc ngay cả từ 0-126, và những người lẻ từ 129-255? –

+0

Vấn đề là tôi không biết ánh xạ chính xác quá nhiều bit, đó là lý do tại sao tôi đã tạo câu hỏi như vậy - để tìm kiếm lại thuật toán phối màu của chương trình X. –

+0

Nếu bạn có thể đăng hình ảnh kết quả, chúng tôi có thể tìm ra ánh xạ các bit. –

Trả lời

2

Nếu bạn đang giảm từ 8 bit đến 7, bạn đang ném đi hầu như không có thông tin. Bạn có chắc là bạn cần hòa bình không?

Nếu bạn cần hoà sắc, thêm tiếng ồn ngẫu nhiên và sau đó clip, nó sẽ rất tốt cho ứng dụng của bạn.

+0

Điều này gần nhất với những gì tôi đã làm và không có câu trả lời nào tốt hơn, vì vậy tôi sẽ đánh dấu câu trả lời này là câu trả lời được chấp nhận. –

3

Bạn có thể sử dụng số ordered dither. Nó trông thô hơn Floyd-Steinberg nhưng không có sự phụ thuộc giữa các điểm ảnh.

Chỉnh sửa: Vì bạn chỉ xóa một bit, điều này trở nên gần như không đáng kể. Nguyên tắc đằng sau sự hoà sắc theo thứ tự là tạo ra một mô hình thiên vị ngưỡng chuyển tiếp; trong trường hợp này, độ lệch sẽ là 0 hoặc 1 và mẫu sẽ là 2x2 pixel. Hai thay đổi này cùng nhau sẽ làm cho mô hình ít khó chịu hơn so với một trong bài viết trên Wikipedia - thậm chí bạn có thể thích nó hơn Floyd-Steinberg.

Dưới đây là một số mã giả:

bias = (X xor Y) and 0x01 
value = pixel + bias 
if value > 255: value = 255 
pixel = value and 0x7e 

Chỉnh sửa 2: Dưới đây là kết quả khác biệt của tôi, một cách tốt nhất như tôi có thể làm. Mà không biết làm thế nào bạn ánh xạ các giá trị 7-bit của bạn trở lại 8 bit tôi không thể làm tốt hơn.

alt text

+0

Phối màu được sắp xếp không phù hợp, bởi vì đầu ra hình ảnh rất khác với phối màu Floyd-Steinberg. (Để thấy sự khác biệt lớn, hãy thử đặt hàng và Steinberg phối màu ảnh với các vùng lớn với màu đơn điệu và so sánh kết quả) –

+0

@ 0x69, tôi thừa nhận câu trả lời là đầu ra là thô. Bạn có thể cho chúng tôi biết chiều sâu bit bạn đang tạo ra không và bảng màu nào bạn đang sử dụng nếu có? –

+0

Xem chỉnh sửa của tôi ... –