简体   繁体   中英

How to compute the total variation of an image in matlab

I'm trying to compute the total variation of an image in matlab using the l1 norm of the spatial first-order derivatives. The code is bellow:

function TV = compute_total_variation1(y)
% y is the image
nbdims = 2;

% check number of channels in an image
if size(y,1)==1 || size(y,2)==1
    % we have one dimension
    nbdims = 1;
end

if size(y,1)>1 && size(y,2)>1 && size(y,3)>1
    % we have three dimensions
    nbdims = 3;
end

if nbdims==1
    TV = sum(abs(diff(y)));
    return;
end

% the total variation weight is 1
% weight_tv = ones(size(y));

g = gradient(y);
% compute using the l1 norm of the first order derivatives
TV = sum( abs(g),nbdims+1);

% TV = TV .* weight_tv;
TV = sum(TV(:));

Am I correctly computing the the total variation using the l1 norm?

Edit:

function TV = compute_total_variation1(y)
% y is the image
nbdims = 2;

% check number of channels in an image
if size(y,1)==1 || size(y,2)==1
    % we have one dimension
    nbdims = 1;
end

if size(y,1)>1 && size(y,2)>1 && size(y,3)>1
    % we have three dimensions
    nbdims = 3;
end

if nbdims==1
    TV = sum(abs(diff(y)));
    return;
end

% the total variation weight is 1
% weight_tv = ones(size(y));

[gx gy] = gradient(y);
% compute using the l1 norm of the first order derivatives
% horizontal
TVgx = sum( abs(gx),nbdims+1);
% vertical
TVgy = sum( abs(gy),nbdims+1);
% TV = TV .* weight_tv;
TV = sum(TVgx(:)) + sum(TVgy(:));

You do not take into account the derivatives on the second dim:

g = gradient(y)

returns only the derivative along the horizontal dimension, in order to get the derivative along the vertical dimension as well, you need

[gx, gy] = gradient(y);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM