class_docstr: Mixin that contain utilities for preparing image features.
class_docstr_tok: ["Mixin","that","contain","utilities","for","preparing","image","features","."]
docstr: Crops `image` to the given size using a center crop. Note that if the image is too small to be cropped to the
  size given, it will be padded (so the returned result has the size asked).
  
  Args:
      image (`PIL.Image.Image` or `np.ndarray` or `torch.Tensor` of shape (n_channels, height, width) or (height, width, n_channels)):
          The image to resize.
      size (`int` or `Tuple[int, int]`):
          The size to which crop the image.
  
  Returns:
      new_image: A center cropped `PIL.Image.Image` or `np.ndarray` or `torch.Tensor` of shape: (n_channels,
      height, width).
docstr_tok: ["Crops","`","image","`","to","the","given","size","using","a","center","crop",".","Note","that","if","the","image","is","too","small","to","be","cropped","to","the","size","given",",","it","will","be","padded","(","so","the","returned","result","has","the","size","asked",")",".","Args",":","image","(","`","PIL.Image.Image","`","or","`","np.ndarray","`","or","`","torch.Tensor","`","of","shape","(","n_channels",",","height",",","width",")","or","(","height",",","width",",","n_channels",")",")",":","The","image","to","resize",".","size","(","`","int","`","or","`","Tuple","[","int",",","int","]","`",")",":","The","size","to","which","crop","the","image",".","Returns",":","new_image",":","A","center","cropped","`","PIL.Image.Image","`","or","`","np.ndarray","`","or","`","torch.Tensor","`","of","shape",":","(","n_channels",",","height",",","width",")","."]
code: def center_crop(self, image, size):
      """
      Crops `image` to the given size using a center crop. Note that if the image is too small to be cropped to the
      size given, it will be padded (so the returned result has the size asked).
  
      Args:
          image (`PIL.Image.Image` or `np.ndarray` or `torch.Tensor` of shape (n_channels, height, width) or (height, width, n_channels)):
              The image to resize.
          size (`int` or `Tuple[int, int]`):
              The size to which crop the image.
  
      Returns:
          new_image: A center cropped `PIL.Image.Image` or `np.ndarray` or `torch.Tensor` of shape: (n_channels,
          height, width).
      """
      self._ensure_format_supported(image)
  
      if not isinstance(size, tuple):
          size = (size, size)
  
      # PIL Image.size is (width, height) but NumPy array and torch Tensors have (height, width)
      if is_torch_tensor(image) or isinstance(image, np.ndarray):
          if image.ndim == 2:
              image = self.expand_dims(image)
          image_shape = (
              image.shape[1:]
              if image.shape[0] in [1, 3]
              else image.shape[:2]
          )
      else:
          image_shape = (image.size[1], image.size[0])
  
      top = (image_shape[0] - size[0]) // 2
      bottom = (
          top + size[0]
      )  # In case size is odd, (image_shape[0] + size[0]) // 2 won't give the proper result.
      left = (image_shape[1] - size[1]) // 2
      right = (
          left + size[1]
      )  # In case size is odd, (image_shape[1] + size[1]) // 2 won't give the proper result.
  
      # For PIL Images we have a method to crop directly.
      if isinstance(image, PIL.Image.Image):
          return image.crop((left, top, right, bottom))
  
      # Check if image is in (n_channels, height, width) or (height, width, n_channels) format
      channel_first = True if image.shape[0] in [1, 3] else False
  
      # Transpose (height, width, n_channels) format images
      if not channel_first:
          if isinstance(image, np.ndarray):
              image = image.transpose(2, 0, 1)
          if is_torch_tensor(image):
              image = image.permute(2, 0, 1)
  
      # Check if cropped area is within image boundaries
      if (
          top >= 0
          and bottom <= image_shape[0]
          and left >= 0
          and right <= image_shape[1]
      ):
          return image[..., top:bottom, left:right]
  
      # Otherwise, we may need to pad if the image is too small. Oh joy...
      new_shape = image.shape[:-2] + (
          max(size[0], image_shape[0]),
          max(size[1], image_shape[1]),
      )
      if isinstance(image, np.ndarray):
          new_image = np.zeros_like(image, shape=new_shape)
      elif is_torch_tensor(image):
          new_image = image.new_zeros(new_shape)
  
      top_pad = (new_shape[-2] - image_shape[0]) // 2
      bottom_pad = top_pad + image_shape[0]
      left_pad = (new_shape[-1] - image_shape[1]) // 2
      right_pad = left_pad + image_shape[1]
      new_image[..., top_pad:bottom_pad, left_pad:right_pad] = image
  
      top += top_pad
      bottom += top_pad
      left += left_pad
      right += left_pad
  
      new_image = new_image[
          ...,
          max(0, top) : min(new_image.shape[-2], bottom),
          max(0, left) : min(new_image.shape[-1], right),
      ]
  
      return new_image
  
imports: import os
  from typing import TYPE_CHECKING, List, Tuple, Union
  import numpy
  from packaging import version
  import requests
  from .utils import ExplicitEnum, is_jax_tensor, is_tf_tensor, is_torch_available, is_torch_tensor, is_vision_available, to_numpy
  from .utils.constants import IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD, IMAGENET_STANDARD_MEAN, IMAGENET_STANDARD_STD
label_desc: Use image node_id 9 for calling the ImageFeatureExtractionMixin obj's underlying member method code with example usage: obj.center_crop(image, size) and returns: new_image, image, image