How to redefine default theme_image() function?
If your purpose is overriding theme_image(), and make Drupal (or third-party modules) use your theme function when calling theme('image'), then you need to implement hook_theme_registry_alter().

function mymodule_theme_registry_alter(&amp;$theme_registry) {
  if (isset($theme_registry['image'])) {
    $theme_registry['image']['function'] = 'theme_cus_image';
  }
}


Implementing that code, when a module uses code similar to the following one, it will call your function, and not theme_image().

$form['enable'] = array(
  '#markup' =&gt; theme('image', array('path' =&gt; 'misc/watchdog-error.png', 'alt' =&gt; $status_short, 'title' =&gt; $status_short)),
);


If you need to override theme_image(), and use your code when the image class is a specific one, and theme_image() in the other cases, then you should use code similar to the following one.

function mymodule_theme_registry_alter(&amp;$theme_registry) {
  if (isset($theme_registry['image'])) {
    $theme_registry['image']['function'] = 'theme_cus_image';
  }
}

function theme_cus_image($variables) {
  if (!empty($variables['attributes']['class']) &amp;&amp; $variables['attributes']['class'] == 'the class you are looking for') {
    // Add your code.
  }
  else {
    return theme_image($variables);
  }
}


The problem with that code is that it is assuming no other module overridden the same theme function. If another module with a lower weight (or for which its hook_theme_registry_alter() is executed first) overrides theme_image(), the new theme function would not be called from the code I shown, as it explicitly calls theme_image().
It is also not possible to call the original theme function with theme('image') as that would cause an infinite loop: theme('image') would call theme_cus_image(), which would call theme('image'), which would call theme_cus_image(), which would call theme('image'), which would call […].

Keep in mind that, with Drupal 7, preprocess functions are invoked also for theme functions that don't use template files. If you want to replace theme_image() just to alter one of the variables it gets, then you can use code similar to the following one, which unsets the width, and the weight of the image.

function mymodule_preprocess_image(&amp;$variables) {
  foreach (array('width', 'height') as $key) {
    unset($variables[$key]);
    unset($variables['attributes'][$key];
  }
}


Similarly, if you would want to alter the class assigned to the image, you could use the following code.

function mymodule_preprocess_image(&amp;$variables) {
  if (!empty($variables['attributes']['class']) &amp;&amp; $variables['attributes']['class'] == 'the class you want to alter') {
    $variables['attributes']['class'] = 'your class';
  }
}


If your purpose is defining a new theme function that is used from your module, then you simply need to implement hook_theme().

function mymodule_theme() {
  return array(
    'cus_image' =&gt; array(
      'variables' =&gt; array('path' =&gt; NULL, 'width' =&gt; NULL, 'height' =&gt; NULL, 'alt' =&gt; '', 'title' =&gt; NULL, 'attributes' =&gt; array()),
    ),
  );
}


In this case, theme_cus_image() will be used from code that calls theme('cus_image'). The code that calls theme('image') will still be using theme_image().