1 | /**
|
2 | * @license
|
3 | * Copyright 2020 Google LLC. All Rights Reserved.
|
4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | * you may not use this file except in compliance with the License.
|
6 | * You may obtain a copy of the License at
|
7 | *
|
8 | * http://www.apache.org/licenses/LICENSE-2.0
|
9 | *
|
10 | * Unless required by applicable law or agreed to in writing, software
|
11 | * distributed under the License is distributed on an "AS IS" BASIS,
|
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13 | * See the License for the specific language governing permissions and
|
14 | * limitations under the License.
|
15 | * =============================================================================
|
16 | */
|
17 | import { ENGINE } from '../../engine';
|
18 | import { RotateWithOffset } from '../../kernel_names';
|
19 | import { convertToTensor } from '../../tensor_util_env';
|
20 | import * as util from '../../util';
|
21 | import { op } from '../operation';
|
22 | /**
|
23 | * Rotates the input image tensor counter-clockwise with an optional offset
|
24 | * center of rotation. Currently available in the CPU, WebGL, and WASM backends.
|
25 | *
|
26 | * @param image 4d tensor of shape `[batch, imageHeight, imageWidth, depth]`.
|
27 | * @param radians The amount of rotation.
|
28 | * @param fillValue The value to fill in the empty space leftover
|
29 | * after rotation. Can be either a single grayscale value (0-255), or an
|
30 | * array of three numbers `[red, green, blue]` specifying the red, green,
|
31 | * and blue channels. Defaults to `0` (black).
|
32 | * @param center The center of rotation. Can be either a single value (0-1), or
|
33 | * an array of two numbers `[centerX, centerY]`. Defaults to `0.5` (rotates
|
34 | * the image around its center).
|
35 | *
|
36 | * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}
|
37 | */
|
38 | function rotateWithOffset_(image, radians, fillValue = 0, center = 0.5) {
|
39 | const $image = convertToTensor(image, 'image', 'rotateWithOffset', 'float32');
|
40 | util.assert($image.rank === 4, () => 'Error in rotateWithOffset: image must be rank 4,' +
|
41 | `but got rank ${$image.rank}.`);
|
42 | const inputs = { image: $image };
|
43 | const attrs = { radians, fillValue, center };
|
44 | const res = ENGINE.runKernel(RotateWithOffset, inputs, attrs);
|
45 | return res;
|
46 | }
|
47 | export const rotateWithOffset = op({ rotateWithOffset_ });
|
48 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlX3dpdGhfb2Zmc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2Uvcm90YXRlX3dpdGhfb2Zmc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGdCQUFnQixFQUFnRCxNQUFNLG9CQUFvQixDQUFDO0FBSW5HLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEtBQUssSUFBSSxNQUFNLFlBQVksQ0FBQztBQUVuQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsaUJBQWlCLENBQ3RCLEtBQTBCLEVBQUUsT0FBZSxFQUMzQyxZQUE2QyxDQUFDLEVBQzlDLFNBQWtDLEdBQUc7SUFDdkMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFOUUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDakIsR0FBRyxFQUFFLENBQUMsa0RBQWtEO1FBQ3BELGdCQUFnQixNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUV4QyxNQUFNLE1BQU0sR0FBMkIsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQTBCLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsQ0FBQztJQUNsRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUN4QixnQkFBZ0IsRUFBRSxNQUE4QixFQUNoRCxLQUEyQixDQUFDLENBQUM7SUFDakMsT0FBTyxHQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxFQUFDLGlCQUFpQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1JvdGF0ZVdpdGhPZmZzZXQsIFJvdGF0ZVdpdGhPZmZzZXRBdHRycywgUm90YXRlV2l0aE9mZnNldElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi8uLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uLy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSb3RhdGVzIHRoZSBpbnB1dCBpbWFnZSB0ZW5zb3IgY291bnRlci1jbG9ja3dpc2Ugd2l0aCBhbiBvcHRpb25hbCBvZmZzZXRcbiAqIGNlbnRlciBvZiByb3RhdGlvbi4gQ3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgQ1BVLCBXZWJHTCwgYW5kIFdBU00gYmFja2VuZHMuXG4gKlxuICogQHBhcmFtIGltYWdlIDRkIHRlbnNvciBvZiBzaGFwZSBgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgZGVwdGhdYC5cbiAqIEBwYXJhbSByYWRpYW5zIFRoZSBhbW91bnQgb2Ygcm90YXRpb24uXG4gKiBAcGFyYW0gZmlsbFZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGluIHRoZSBlbXB0eSBzcGFjZSBsZWZ0b3ZlclxuICogICAgIGFmdGVyIHJvdGF0aW9uLiBDYW4gYmUgZWl0aGVyIGEgc2luZ2xlIGdyYXlzY2FsZSB2YWx1ZSAoMC0yNTUpLCBvciBhblxuICogICAgIGFycmF5IG9mIHRocmVlIG51bWJlcnMgYFtyZWQsIGdyZWVuLCBibHVlXWAgc3BlY2lmeWluZyB0aGUgcmVkLCBncmVlbixcbiAqICAgICBhbmQgYmx1ZSBjaGFubmVscy4gRGVmYXVsdHMgdG8gYDBgIChibGFjaykuXG4gKiBAcGFyYW0gY2VudGVyIFRoZSBjZW50ZXIgb2Ygcm90YXRpb24uIENhbiBiZSBlaXRoZXIgYSBzaW5nbGUgdmFsdWUgKDAtMSksIG9yXG4gKiAgICAgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnMgYFtjZW50ZXJYLCBjZW50ZXJZXWAuIERlZmF1bHRzIHRvIGAwLjVgIChyb3RhdGVzXG4gKiAgICAgdGhlIGltYWdlIGFyb3VuZCBpdHMgY2VudGVyKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIHJvdGF0ZVdpdGhPZmZzZXRfKFxuICAgIGltYWdlOiBUZW5zb3I0RHxUZW5zb3JMaWtlLCByYWRpYW5zOiBudW1iZXIsXG4gICAgZmlsbFZhbHVlOiBudW1iZXJ8W251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gMCxcbiAgICBjZW50ZXI6IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdID0gMC41KTogVGVuc29yNEQge1xuICBjb25zdCAkaW1hZ2UgPSBjb252ZXJ0VG9UZW5zb3IoaW1hZ2UsICdpbWFnZScsICdyb3RhdGVXaXRoT2Zmc2V0JywgJ2Zsb2F0MzInKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbWFnZS5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIHJvdGF0ZVdpdGhPZmZzZXQ6IGltYWdlIG11c3QgYmUgcmFuayA0LCcgK1xuICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG5cbiAgY29uc3QgaW5wdXRzOiBSb3RhdGVXaXRoT2Zmc2V0SW5wdXRzID0ge2ltYWdlOiAkaW1hZ2V9O1xuICBjb25zdCBhdHRyczogUm90YXRlV2l0aE9mZnNldEF0dHJzID0ge3JhZGlhbnMsIGZpbGxWYWx1ZSwgY2VudGVyfTtcbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFJvdGF0ZVdpdGhPZmZzZXQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG4gIHJldHVybiByZXMgYXMgVGVuc29yNEQ7XG59XG5cbmV4cG9ydCBjb25zdCByb3RhdGVXaXRoT2Zmc2V0ID0gb3Aoe3JvdGF0ZVdpdGhPZmZzZXRffSk7XG4iXX0= |
\ | No newline at end of file |