0

I'm trying to develop the adaptive unsharp algorithm described by Polesel et al. in the article "Image Enhancement via Adaptive Unsharp Masking" (link to the article). The core of the algorithm is the minimization of a cost function defined as:

J(m,n) = E[e(m,n)^2] = E[(gd(m,n)-gy(m,n))^2]

where E[] is the statistical expectation and gy(m,n) is:

gy(m,n) = gx(m,n) + lambda1(m,n)*gzx(m,n) + lambda2(m,n)*gzy(m,n);

I want to find lambda1 and lambda2 for each pixel in order to minimize the cost function in each pixel. Here the code that I wrote so far:

function [ o_sharpened_image ] = AdaptativeUnsharpMask( i_image , t1, t2)
%ADAPTATIVEUNSHARPMASK Summary of this function goes here
%   Detailed explanation goes here
if isa(i_image,'dip_image')
    i_image = dip_array(i_image);
end
if ~isfloat(i_image)
    i_image = im2double(i_image);
end
adh = 4;
adl = 3;
g = [-1 -1 -1; -1 8 -1; -1 -1 -1];
dim = size(i_image);
lambda_x = 0.5*ones(dim);
lambda_y = 0.5*ones(dim);
z_x  = conv2(i_image,[-1 2 -1],'same');
z_y  = conv2(i_image,[-1; 2; -1],'same');
g_x  = conv2(i_image,g,'same');
g_zx = conv2(z_x,g,'same');
g_zy = conv2(z_y,g,'same');

a = ones(dim);
variance_map = colfilt(i_image,[3 3],'sliding',@var);
a(variance_map >= t1 & variance_map < t2) = adh;
a(variance_map >= t2) = adl;
g_d = a.*g_x;

lambda = [lambda_x lambda_y];

lambda0 = lambda;
lambda_min = lsqnonlin(@(lambda) UnsharpCostFunction(lambda,g_d,g_zx,g_zy),lambda0); 

o_sharpened_image = i_image + lambda_min(:,1:size(i_image,2)).*z_x + lambda_min(:,size(i_image,2)+1:end).*z_y;

end

Here the code of the cost function:

function [ J ] = UnsharpCostFunction( i_lambda, i_gd, i_gzx, i_gzy )
%UNSHARPCOSTFUNCTION Summary of this function goes herek

gy = i_gd + i_lambda(:,1:size(i_gd,2)).*i_gzx + i_lambda(:,size(i_gd,2)+1:end).*i_gzy;
J = mean((i_gd(:) - gy(:)).^2);

end

For each iteration I print on the command window the value of the J function and it is always the same. What am I doing wrong?

Thank you.

BugsFree
  • 540
  • 1
  • 6
  • 24
  • statistical expectation means the "average." fminuc might work for you. If your problem is least squares, you can also use lsqnonlin. It is hard to tell you exactly what to use/do without more context. In the case of of "per-pixel" cost you usually have to do some form of regularization. The most common is MRF/CRF. But, don't have access to the referenced article. – bendervader Jun 07 '15 at 07:14
  • Thank you for your comment. I should have made some progress ( I edited the question), but now I am again stuck because it seems that the algorithm doesn't update the values. – BugsFree Jun 08 '15 at 11:27

0 Answers0