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.