HISTOEQUALIZATION_BASE - Base function for HISTOEQUALIZATION.

Contents

Syntax

x = HISTOEQUALIZATION_BASE(x, y, dir, absval, hinterp);
x = HISTOEQUALIZATION_BASE(x, 'gauss', dir, absval, hinterp);
x = HISTOEQUALIZATION_BASE(x, 'lin', dir, absval, hinterp);

See also

Ressembles: HISTOEQUALIZATION, Requires: INTERP1, SORT, LINSPACE.

Function implementation

function x = histoequalization_base(x, y, dir, absval, hinterp)

if iscell(x)
    for i=1:length(x)
        if ischar(y),  yy =y;  else yy = y{i};  end
        x{i} = histoequalization_base(x{i}, yy, dir, absval, hinterp);
    end
    return;

elseif ~isempty(dir) && ischar(dir)
    if strcmpi(dir,'col')
        for i=1:size(x,2)
            if ischar(y),  yy =y;  else yy = y(:,i);  end
            x(:,i) = histoequalization_base(x(:,i), yy, dir, absval, hinterp);
        end

    elseif strcmpi(dir,'row')
        for i=1:size(x,1)
            if ischar(y),  yy =y;  else yy = y(i,:);  end
            x(i,:) = histoequalization_base(x(i,:), yy, dir, absval, hinterp);
        end

    elseif strcmpi(dir,'vec')
        for i=1:size(x,3)
            if ischar(y),  yy =y;  else yy = y(:,:,i);  end
            x(:,:,i) = histoequalization_base(x(:,:,i), yy, dir, absval, hinterp);
        end
    end

    return;
end

sx = size(x);
x = x(:);

if ischar(y)
    if strcmpi(y,'gauss')
        y = randn(length(x));

    elseif strcmpi(y,'lin') % uniform density
        y = linspace(0,1,length(x));

    else
        error('histoequalization_base:inputerror', 'unknown density');
    end
end

y = y(:);

if absval
    s = sign(x);
    x = abs(x);
    y = abs(y);
end

[~,Ix] = sort(x);
vy = sort(y);

nx = length(x);
ny = length(y);

ax = linspace(1,ny,nx)';
ay = (1:ny)';
vx = interp1(ay,vy,ax);
x(Ix) = (1-hinterp)*x(Ix) + hinterp*vx;

if absval,  x = x .* s;  end

x = reshape(x,sx);

end % end of histoequalization_base