title: How to compute the total variation of an image in matlab
body: <p>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:</p>
  
  <pre><code>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)&gt;1 &amp;&amp; size(y,2)&gt;1 &amp;&amp; size(y,3)&gt;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(:));
  </code></pre>
  
  <p>Am I correctly computing the the total variation using the l1 norm? </p>
  
  <p><strong>Edit:</strong></p>
  
  <pre><code>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)&gt;1 &amp;&amp; size(y,2)&gt;1 &amp;&amp; size(y,3)&gt;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(:));
  </code></pre>