Thuật toán đằng sau lớp điều chỉnh màu đen và trắng của Photoshop là gì?


11

Ai đó có thể giải thích thuật toán đằng sau lớp điều chỉnh "Đen và Trắng" trong photoshop không?

Ảnh chụp màn hình Photoshop

Tôi phải sao chép nó bằng C ++ cho một ứng dụng nhấn mạnh các pixel không phải màu đỏ / đỏ tươi (ish) từ một hình ảnh (với dung sai có thể định cấu hình giống như phần trăm) và tài nguyên này cho thấy hành vi mà tôi mong đợi.


Vẫn không thể sao chép nó, nhưng tôi tìm thấy một manh mối:

Mỗi pixel được xác định bởi tối đa hai điều khiển, một phụ gia (RGB) và một trừ (CMY).


Bạn đã bao giờ đến gần hơn để tìm ra thuật toán? Tôi đang cố gắng để tìm ra điều này là tốt.
pizzafilms

Không, tôi đã không: /
Blamoo

Câu trả lời:


4

Tôi đã sao chép thuật toán một cách hoàn hảo trong MATLAB (Dựa trên câu trả lời @ Ivan Kuckir ):

function [ mO ] = ApplyBlackWhiteFilter( mI, vCoeffValues )

FALSE   = 0;
TRUE    = 1;

OFF = 0;
ON  = 1;

numRows = size(mI, 1);
numCols = size(mI, 2);
dataClass = class(mI);

numCoeff    = size(vCoeffValues, 1);
hueRadius   = 1 / numCoeff;
vHueVal     = [0:(numCoeff - 1)] * hueRadius;

mHsl = ConvertRgbToHsl(mI);
mO = zeros(numRows, numCols, dataClass);

vCoeffValues = numCoeff * vCoeffValues;

for jj = 1:numCols
    for ii = 1:numRows
        hueVal = mHsl(ii, jj, 1);
        lumCoeff = 0;

        % For kk = 1 we're dealing with circular distance
        diffVal     = min(abs(vHueVal(1) - hueVal), abs(1 - hueVal));
        lumCoeff    = lumCoeff + (vCoeffValues(1) * max(0, hueRadius - diffVal));
        for kk = 2:numCoeff
            lumCoeff = lumCoeff + (vCoeffValues(kk) * max(0, hueRadius - abs(vHueVal(kk) - hueVal)));
        end

        mO(ii, jj) = mHsl(ii, jj, 3) * (1 + lumCoeff);
    end
end


end

Hãy chú ý rằng việc chuyển đổi từ vPhotoshopValuesthành vCoeffValuesnên được thực hiện như vCoeffValues = (vPhotoshopValues - 50) ./ 50.
Vì các giá trị Photoshop nằm trong [-200, 300] và nên được ánh xạ tuyến tính thành [-5, 5] với 50 -> 0.

Đây là một so sánh với Photoshop:

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

Lỗi tối đa nhỏ hơn 1 trong phạm vi [0, 255].

Mã đầy đủ có sẵn trên Kho lưu trữ tín hiệu StackExchange của tôi Q688 GitHub .


8

Mỗi hình ảnh (màu) bao gồm các thành phần RGB. khi bạn thêm (hoặc giảm) một giá trị không đổi cho tất cả các pixel chỉ trong các thành phần RED, bạn sẽ thấy hiệu ứng tương đương với việc di chuyển tab RED sang bên phải và cùng cách giảm thành phần RED bằng một hằng số sẽ có hiệu ứng ngược.

Giống như khôn ngoan, bạn có thể tăng / giảm từng thành phần theo một giá trị cố định như được mô tả. Nếu bạn tăng / giảm TẤT CẢ các thành phần RGB theo cùng một giá trị thì điều này sẽ tương đương với thay đổi độ sáng (về cơ bản bạn đang thêm / xóa màu TRẮNG).

Cyan, Blue, Magenta - tương ứng với sự biến đổi như vậy trong không gian màu CMYK. (Nhưng tôi đoán, màu xanh lam trong không gian màu này tương ứng với sự pha trộn của màu lục lam và màu vàng. Vì vậy, đó là một chút khó khăn. Sự chuyển đổi về cơ bản là giống nhau cho tất cả.

Phần tử cuối cùng Tint: {Hue và Saturation} tương ứng với các hoạt động tương tự nhưng ở đây, các hình ảnh được chuyển đổi đầu tiên trong mô hình HSV và sau đó HUE và Saturation được thêm / trừ độc lập.

Tôi không biết về mối quan hệ chính xác của các điểm đánh dấu của mặt số với các số tương ứng nhưng bạn có thể tìm ra bằng cách thử các giá trị thực tế.


1
Có RGB và CMY, vì vậy tất cả những gì bạn cần làm là chuyển đổi sang bất kỳ hai không gian màu nào và bạn có thể điều chỉnh bao nhiêu tùy ý. Chỉ cần đừng quên cập nhật bộ ba khác sau khi bạn điều chỉnh xong.
Jonas

Tôi tin rằng câu trả lời này là không chính xác và không đầy đủ. 1. Trong triển khai PS, trượt thanh trượt "màu xanh" không ảnh hưởng đến độ sáng của pixel cyan-ish và trượt thanh trượt "cyan" không ảnh hưởng đến độ sáng của pixel màu xanh lam. Cách tiếp cận này được mô tả trong câu trả lời này sẽ không hoạt động như thế. 2. bạn không mô tả làm thế nào, sau khi các thành phần RGBCMY bị thao túng, chúng được chuyển đổi thành thang độ xám (mặc dù đây có thể là một dotProduct(color, vec3(0.2989, 0.5870, 0.1140)hoạt động). 3. Màu xanh không "tương ứng với sự pha trộn giữa màu lục lam và màu vàng" trong bất kỳ không gian màu nào.
Stefan Monov

4. Bạn không đề cập rằng thao tác màu được thực hiện sau khi chuyển đổi sang thang độ xám chứ không phải trước đó.
Stefan Monov
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.