public class **ImageProcessor** ImageProcessor is a helper class for preprocessing and postprocessing `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage`. It
could transform a `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage` to another by executing a chain of `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageOperator`.

Example Usage:

```
   ImageProcessor processor = new ImageProcessor.Builder()
       .add(new ResizeOp(224, 224, ResizeMethod.NEAREST_NEIGHBOR)
       .add(new Rot90Op())
       .add(new NormalizeOp(127.5f, 127.5f))
       .build();
   TensorImage anotherTensorImage = processor.process(tensorImage);
 
```

**WARNING:** Instances of an `ImageProcessor` are **not** thread-safe with `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor#updateNumberOfRotations(int)`. Updating the number of rotations and then processing images (using
`https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/common/SequentialProcessor#process(T)`) must be protected from concurrent access. It is recommended to create separate
`ImageProcessor` instances for each thread. If multiple threads access a `ImageProcessor` concurrently, it must be synchronized externally.

##### See Also

- `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor.Builder`
- `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor#process(org.tensorflow.lite.support.image.TensorImage)`

<br />

<br />

### Nested Classes

|---|---|---|---|
| class | [ImageProcessor.Builder](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor.Builder) || The Builder to create an ImageProcessor, which could be executed later. |

### Public Methods

|---|---|
| RectF | [inverseTransform](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor#inverseTransform(RectF,%20int,%20int))(RectF rect, int inputImageHeight, int inputImageWidth) Transforms a rectangle from coordinates system of the result image back to the one of the input image. |
| PointF | [inverseTransform](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor#inverseTransform(PointF,%20int,%20int))(PointF point, int inputImageHeight, int inputImageWidth) Transforms a point from coordinates system of the result image back to the one of the input image. |
| [TensorImage](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage) | [process](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor#process(org.tensorflow.lite.support.image.TensorImage))([TensorImage](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage) image) Processes a `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage` object with prepared `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/common/TensorOperator`. |
| void | [updateNumberOfRotations](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor#updateNumberOfRotations(int))(int k) Updates the number of rotations for the first `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ops/Rot90Op` in this `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor`. |
| synchronized void | [updateNumberOfRotations](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor#updateNumberOfRotations(int,%20int))(int k, int occurrence) Updates the number of rotations for the `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ops/Rot90Op` specified by `occurrence` in this `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor`. |

### Inherited Methods

From class [org.tensorflow.lite.support.common.SequentialProcessor](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/common/SequentialProcessor)

|---|---|
| [TensorImage](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage) | [process](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/common/SequentialProcessor#process(T))([TensorImage](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage) x) |

From class java.lang.Object

|---|---|
| boolean | equals([Object](https://developer.android.com/reference/java/lang/Object.html) arg0) |
| final [Class](https://developer.android.com/reference/java/lang/Class.html)\<?\> | getClass() |
| int | hashCode() |
| final void | notify() |
| final void | notifyAll() |
| [String](https://developer.android.com/reference/java/lang/String.html) | toString() |
| final void | wait(long arg0, int arg1) |
| final void | wait(long arg0) |
| final void | wait() |

From interface [org.tensorflow.lite.support.common.Processor](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/common/Processor)

|---|---|
| abstract [TensorImage](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage) | [process](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/common/Processor#process(T))([TensorImage](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage) input) |

## Public Methods

#### public RectF
**inverseTransform**
(RectF rect, int inputImageHeight, int inputImageWidth)

Transforms a rectangle from coordinates system of the result image back to the one of the input
image.

##### Parameters

| rect | the rectangle from the result coordinates system. |
| inputImageHeight | the height of input image. |
| inputImageWidth | the width of input image. |
|---|---|

##### Returns

- the rectangle with the coordinates from the coordinates system of the input image.

#### public PointF
**inverseTransform**
(PointF point, int inputImageHeight, int inputImageWidth)

Transforms a point from coordinates system of the result image back to the one of the input
image.

##### Parameters

| point | the point from the result coordinates system. |
| inputImageHeight | the height of input image. |
| inputImageWidth | the width of input image. |
|---|---|

##### Returns

- the point with the coordinates from the coordinates system of the input image.

#### public [TensorImage](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage)
**process**
([TensorImage](https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage) image)

Processes a `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/TensorImage` object with prepared `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/common/TensorOperator`.

##### Parameters

| image |   |
|---|---|

##### Throws

| [IllegalArgumentException](https://developer.android.com/reference/java/lang/IllegalArgumentException.html) | if the image is not supported by any op. |
|---|---|

#### public void
**updateNumberOfRotations**
(int k)

Updates the number of rotations for the first `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ops/Rot90Op` in this `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor`.

**WARNING:** this method is **not** thread-safe. Updating the number of rotations and
then processing images (using `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/common/SequentialProcessor#process(T)`) must be protected from concurrent access with
additional synchronization.

<br />

##### Parameters

| k | the number of rotations |
|---|---|

##### Throws

| [IllegalStateException](https://developer.android.com/reference/java/lang/IllegalStateException.html) | if `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ops/Rot90Op` has not been added to this `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor` |
|---|---|

#### public synchronized void
**updateNumberOfRotations**
(int k, int occurrence)

Updates the number of rotations for the `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ops/Rot90Op` specified by `occurrence` in this
`https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor`.

**WARNING:** this method is **not** thread-safe. Updating the number of rotations and
then processing images (using `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/common/SequentialProcessor#process(T)`) must be protected from concurrent access with
additional synchronization.

<br />

##### Parameters

| k | the number of rotations |
| occurrence | the index of perticular `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ops/Rot90Op` in this `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor`. For example, if the second `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ops/Rot90Op` needs to be updated, `occurrence` should be set to 1. |
|---|---|

##### Throws

| [IndexOutOfBoundsException](https://developer.android.com/reference/java/lang/IndexOutOfBoundsException.html) | if `occurrence` is negative or is not less than the number of `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ops/Rot90Op` in this `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor` |
| [IllegalStateException](https://developer.android.com/reference/java/lang/IllegalStateException.html) | if `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ops/Rot90Op` has not been added to this `https://developers.google.com/edge/api/tflite/java/org/tensorflow/lite/support/image/ImageProcessor` |
|---|---|