Apa Algoritma Di Balik Penyesuaian “Hitam dan Putih” Photoshop?

11

Dapatkah seseorang menjelaskan algoritma di balik lapisan penyesuaian "Hitam dan Putih" di photoshop?

Tangkapan layar Photoshop

Saya harus mereproduksinya menggunakan C ++ untuk aplikasi yang menekankan piksel non-merah / magenta (ish) dari gambar (dengan toleransi yang dapat dikonfigurasi seperti persen), dan sumber daya ini menunjukkan perilaku yang saya harapkan.


Masih tidak bisa mereproduksi, tetapi saya menemukan petunjuk:

Setiap piksel ditentukan hingga dua kontrol, satu aditif (RGB) dan satu subtractive (CMY).

Blamoo
sumber
Apakah Anda pernah lebih dekat dengan mencari tahu algoritma? Saya mencoba mencari tahu ini juga.
pizzafilms
Tidak, saya tidak: /
Blamoo

Jawaban:

4

Saya meniru algoritma dengan sempurna di MATLAB (Berdasarkan pada @ Ivan Kuckir jawaban):

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

Perhatikan bahwa konversi dari vPhotoshopValueske vCoeffValuesharus dilakukan sebagai vCoeffValues = (vPhotoshopValues - 50) ./ 50.
Karena nilai Photoshop ada di [-200, 300] dan harus dipetakan secara linear ke [-5, 5] dengan 50 -> 0.

Berikut ini adalah perbandingan dengan Photoshop:

masukkan deskripsi gambar di sini

Kesalahan maksimum kurang dari 1 dalam rentang [0, 255].

Kode lengkap tersedia di Pemrosesan Sinyal StackExchange GitHub Q688 saya .

Royi
sumber
8

Setiap gambar (warna) terdiri dari komponen RGB. ketika Anda menambahkan (atau mengurangi) nilai konstan ke semua piksel hanya di komponen RED, Anda akan melihat efek yang setara dengan menggerakkan tab RED ke kanan, dan dengan cara yang sama mengurangi komponen RED dengan konstanta akan memiliki efek sebaliknya.

Seperti bijaksana Anda dapat menambah / mengurangi setiap komponen dengan nilai tetap seperti yang dijelaskan. Jika Anda menambah / mengurangi SEMUA komponen RGB dengan nilai yang sama, ini akan setara dengan perubahan kecerahan (pada dasarnya Anda menambah / menghapus warna PUTIH).

Cyan, Blue, Magenta - sesuai dengan transformasi dalam ruang warna CMYK. (Tapi saya kira, Biru dalam ruang warna ini sesuai dengan campuran Cyan dan Kuning. Jadi itu agak rumit. Transformasi pada dasarnya sama untuk semua.

Elemen warna terakhir: {Hue dan Saturation} sesuai dengan operasi yang sama tetapi di sini, gambar pertama-tama ditransformasikan dalam model HSV dan kemudian HUE dan Saturation ditambahkan / dikurangi secara independen.

Saya tidak tahu tentang hubungan yang tepat dari penanda dial ke nomor yang sesuai tetapi Anda dapat mencari tahu dengan mencoba nilai-nilai praktis.

Dipan Mehta
sumber
1
Ada RGB dan CMY, jadi yang perlu Anda lakukan adalah mengubah salah satu dari dua ruang warna dan Anda dapat menyesuaikan sebanyak yang Anda inginkan. Jangan lupa untuk memperbarui triplet lainnya setelah Anda selesai menyesuaikan.
Jonas
Saya percaya jawaban ini salah dan tidak lengkap. 1. Dalam implementasi PS, menggeser slider "biru" tidak mempengaruhi kecerahan piksel cyan-ish dan menggeser slider "cyan" tidak mempengaruhi kecerahan piksel biru. Pendekatan ini yang dijelaskan dalam jawaban ini tidak akan berfungsi seperti itu. 2. Anda tidak menjelaskan bagaimana, setelah komponen RGBCMY dimanipulasi, mereka dikonversi ke grayscale (meskipun mungkin dotProduct(color, vec3(0.2989, 0.5870, 0.1140)operasi). 3. Biru tidak "sesuai dengan campuran cyan dan kuning" di ruang warna apa pun.
Stefan Monov
4. Anda tidak menyebutkan bahwa operasi rona dilakukan setelah konversi ke skala abu-abu dan tidak sebelum itu.
Stefan Monov