Algorithm Matlab多变量极小化

Algorithm Matlab多变量极小化,algorithm,matlab,image-processing,optimization,minimization,Algorithm,Matlab,Image Processing,Optimization,Minimization,我正在尝试开发Polesel等人在文章“通过自适应反锐化掩蔽增强图像”(adaptive unsharp Masking)中描述的自适应反锐化算法。该算法的核心是成本函数的最小化,定义如下: J(m,n) = E[e(m,n)^2] = E[(gd(m,n)-gy(m,n))^2] 式中,E[]是统计期望,gy(m,n)是: 我想找到每个像素的lambda1和lambda2,以便最小化每个像素中的代价函数。 这里是我到目前为止编写的代码: function [ o_sharpened_imag

我正在尝试开发Polesel等人在文章“通过自适应反锐化掩蔽增强图像”(adaptive unsharp Masking)中描述的自适应反锐化算法。该算法的核心是成本函数的最小化,定义如下:

J(m,n) = E[e(m,n)^2] = E[(gd(m,n)-gy(m,n))^2]
式中,E[]是统计期望,gy(m,n)是:

我想找到每个像素的lambda1和lambda2,以便最小化每个像素中的代价函数。 这里是我到目前为止编写的代码:

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
对于每次迭代,我在命令窗口中打印J函数的值,并且它总是相同的。我做错了什么


谢谢。

统计期望值表示“平均值”。fminuc可能适合您。如果你的问题是最小二乘法,你也可以使用lsqnonlin。没有更多的上下文,很难准确地告诉你该使用/做什么。在“每像素”成本的情况下,您通常必须进行某种形式的正则化。最常见的是MRF/CRF。但是,您无权访问引用的文章。谢谢您的评论。我本应该取得一些进展(我编辑了这个问题),但现在我又被卡住了,因为算法似乎没有更新值。
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
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