def affine_transform(
    boxes,
    angle,
    translate_x,
    translate_y,
    scale,
    shear_x,
    shear_y,
    height,
    width,
    center_x=None,
    center_y=None,
    bounding_box_format="xyxy",
):
    """Applies an affine transformation to the bounding boxes.

    The `height` and `width` parameters are used to normalize the
    translation and scaling factors.

    Args:
        boxes: The bounding boxes to transform, a tensor/array of shape
            `(N, 4)` or `(batch_size, N, 4)`.
        angle: Rotation angle in degrees.
        translate_x: Horizontal translation fraction.
        translate_y: Vertical translation fraction.
        scale: Scaling factor.
        shear_x: Shear angle in x-direction (degrees).
        shear_y: Shear angle in y-direction (degrees).
        height: Height of the image/data.
        width: Width of the image/data.
        center_x:  x-coordinate of the transformation center (fraction).
        center_y: y-coordinate of the transformation center (fraction).
        bounding_box_format: The format of the input bounding boxes. Defaults to
            `"xyxy"`.

    Returns:
        The transformed bounding boxes, a tensor/array with the same shape
        as the input `boxes`.
    """
    if bounding_box_format != "xyxy":
        raise NotImplementedError
    box_utils = BoundingBox()
    # Switch to tensorflow backend if we are in tf.data pipe
    if backend_utils.in_tf_graph():
        box_utils.backend.set_backend("tensorflow")

    boxes = box_utils.affine(
        boxes,
        angle,
        translate_x,
        translate_y,
        scale,
        shear_x,
        shear_y,
        height,
        width,
        center_x=center_x,
        center_y=center_y,
    )
    box_utils.backend.reset()
    return boxes
Applies an affine transformation to the bounding boxes.

    The `height` and `width` parameters are used to normalize the
    translation and scaling factors.

    Args:
        boxes: The bounding boxes to transform, a tensor/array of shape
            `(N, 4)` or `(batch_size, N, 4)`.
        angle: Rotation angle in degrees.
        translate_x: Horizontal translation fraction.
        translate_y: Vertical translation fraction.
        scale: Scaling factor.
        shear_x: Shear angle in x-direction (degrees).
        shear_y: Shear angle in y-direction (degrees).
        height: Height of the image/data.
        width: Width of the image/data.
        center_x:  x-coordinate of the transformation center (fraction).
        center_y: y-coordinate of the transformation center (fraction).
        bounding_box_format: The format of the input bounding boxes. Defaults to
            `"xyxy"`.

    Returns:
        The transformed bounding boxes, a tensor/array with the same shape
        as the input `boxes`.
    
keras/src/layers/preprocessing/image_preprocessing/bounding_boxes/converters.py