อัลกอริทึมที่อยู่เบื้องหลังการปรับเลเยอร์“ ขาวดำ” ของ Photoshop คืออะไร?


11

บางคนสามารถอธิบายอัลกอริทึมที่อยู่เบื้องหลังเลเยอร์การปรับ "ขาวดำ" ใน photoshop ได้ไหม?

ภาพหน้าจอของ Photoshop

ฉันต้องทำซ้ำโดยใช้ C ++ สำหรับแอปพลิเคชันที่เน้นพิกเซลที่ไม่ใช่สีแดง / สีม่วงแดง (ish) จากรูปภาพ (ที่มีความอดทนร้อยละเหมือนกำหนดค่าได้) และทรัพยากรนี้แสดงพฤติกรรมที่ฉันคาดหวัง


ยังคงทำซ้ำไม่ได้ แต่ฉันพบเบาะแส:

แต่ละพิกเซลถูกกำหนดโดยตัวควบคุมมากถึงสองตัวเสริมหนึ่ง (RGB) และหนึ่งลบ (CMY)


คุณเคยเข้าใกล้เพื่อหาอัลกอริทึมหรือไม่? ฉันพยายามคิดออกเช่นกัน
pizzafilms

ไม่ฉันไม่ได้: /
Blamoo

คำตอบ:


4

ฉันทำซ้ำอัลกอริทึมอย่างสมบูรณ์ใน MATLAB (ตามคำตอบ@ 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

ให้ความสนใจว่าการแปลงจากvPhotoshopValuesถึงvCoeffValuesควรทำเช่นvCoeffValues = (vPhotoshopValues - 50) ./ 50นั้น
เป็นค่า Photoshop อยู่ใน [-200 300] และควรจะเป็นเส้นตรงแมปลงใน [-5, 5] 50 -> 0ด้วย

นี่คือการเปรียบเทียบกับ Photoshop:

ป้อนคำอธิบายรูปภาพที่นี่

ข้อผิดพลาดสูงสุดน้อยกว่า 1 ในช่วง [0, 255]

รหัสเต็มสามารถใช้ได้บนของStackExchange การประมวลผลสัญญาณ Q688 GitHub Repository


8

แต่ละภาพ (สี) ประกอบด้วยส่วนประกอบ RGB เมื่อคุณเพิ่ม (หรือลด) ค่าคงที่ของพิกเซลทั้งหมดเฉพาะในองค์ประกอบ RED คุณจะเห็นเอฟเฟกต์เทียบเท่ากับการย้ายแท็บ RED ไปทางขวาและในทำนองเดียวกันการลดองค์ประกอบ RED ด้วยค่าคงที่จะมีผลย้อนกลับ

เช่นเดียวกับที่ชาญฉลาดคุณสามารถเพิ่ม / ลดแต่ละองค์ประกอบด้วยค่าคงที่ตามที่อธิบายไว้ หากคุณเพิ่ม / ลดส่วนประกอบ RGB ทั้งหมดด้วยค่าเดียวกันสิ่งนี้จะเทียบเท่ากับการเปลี่ยนความสว่าง (โดยทั่วไปคุณจะเพิ่ม / ลบสีขาว)

Cyan, Blue, Magenta - สอดคล้องกับการเปลี่ยนแปลงดังกล่าวในพื้นที่สี CMYK (แต่ฉันเดาว่าสีน้ำเงินในพื้นที่สีนี้สอดคล้องกับการผสมของสีฟ้าและสีเหลืองดังนั้นมันจึงค่อนข้างยุ่งยากการเปลี่ยนแปลงนั้นเหมือนกันสำหรับทุกคน

องค์ประกอบสุดท้าย Tint: {Hue and Saturation} สอดคล้องกับการดำเนินการเดียวกัน แต่ที่นี่รูปภาพจะถูกเปลี่ยนเป็นครั้งแรกในรูปแบบ HSV จากนั้น HUE และ Saturation จะถูกเพิ่ม / ลบออกอย่างอิสระ

ฉันไม่รู้เกี่ยวกับความสัมพันธ์ที่แน่นอนของเครื่องหมายของการโทรกับหมายเลขที่เกี่ยวข้อง แต่คุณสามารถคำนวณได้โดยลองใช้ค่าจริง


1
มี RGB และ CMY ดังนั้นสิ่งที่คุณต้องทำคือเปลี่ยนเป็นสีใดสีหนึ่งในสองช่องและคุณสามารถปรับได้มากเท่าที่คุณต้องการ อย่าลืมอัปเดต triplet อื่น ๆ เมื่อคุณปรับเปลี่ยนเสร็จแล้ว
Jonas

ฉันเชื่อว่าคำตอบนี้ไม่ถูกต้องและไม่สมบูรณ์ 1. ในการติดตั้ง PS การเลื่อนตัวเลื่อน "สีน้ำเงิน" ไม่ส่งผลกระทบต่อความสว่างของพิกเซล cyan-ish และการเลื่อนตัวเลื่อน "cyan" ไม่กระทบความสว่างของพิกเซลสีน้ำเงิน วิธีนี้อธิบายไว้ในคำตอบนี้จะไม่ทำงานอย่างนั้น 2. คุณไม่ได้อธิบายว่าหลังจากจัดการส่วนประกอบ RGBCMY แล้วพวกเขาจะถูกแปลงเป็นโทนสีเทา (แม้ว่าอาจเป็นการdotProduct(color, vec3(0.2989, 0.5870, 0.1140)ดำเนินการ) 3. สีน้ำเงินไม่ "ตรงกับสีฟ้าและสีเหลือง" ในพื้นที่สีใด ๆ
Stefan Monov

4. คุณไม่ได้กล่าวถึงว่าการใช้โทนสีจะดำเนินการหลังจากการแปลงเป็นโทนสีเทาและไม่ใช่ก่อนหน้านั้น
Stefan Monov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.