আমি ম্যাটল্যাবে পুরোপুরি অ্যালগরিদমের অনুলিপি করেছি (@ ইভান ককির উত্তরের ভিত্তিতে ):
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
।
ফটোশপের মানগুলি [-200, 300] এ থাকায় এবং [-5, 5] এর সাথে রৈখিকভাবে ম্যাপ করা উচিত 50 -> 0
।
এখানে ফটোশপের সাথে একটি তুলনা করা হল:
সর্বাধিক ত্রুটি [0, 255] রেঞ্জের 1 এরও কম।
সম্পূর্ণ কোড আমার পাওয়া যায় StackExchange সিগন্যাল প্রসেসিং Q688 GitHub সংগ্রহস্থলের প্রয়োগ ।