TensorFlow.js предоставляет мощный инструментарий для работы с изображениями и пикселями непосредственно в браузере или в Node.js. Основой для обработки изображений служат тензоры, которые могут представлять пиксели как многомерные массивы чисел.
Для работы с пикселями сначала изображение необходимо преобразовать в
тензор. В браузере чаще всего используются элементы
<img>, <canvas> или видео
<video>.
const imgElement = document.getElementById('myImage');
const tensor = tf.browser.fromPixels(imgElement);
Ключевые моменты:
tf.browser.fromPixels автоматически создает тензор
размерности [height, width, 3] для RGB или
[height, width, 4] для RGBA.int32.[0, 255].Для дальнейшей работы с нейронными сетями часто требуется нормализация:
const normalizedTensor = tensor.toFloat().div(tf.scalar(255));
Это переводит значения пикселей в диапазон [0, 1], что
улучшает сходимость моделей.
Canvas API предоставляет ImageData, содержащий массив
пикселей в формате [R, G, B, A, R, G, B, A, ...]. Для
преобразования в тензор:
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const tensorFromImageData = tf.browser.fromPixels(imageData);
Особенности:
ImageData.data — это
Uint8ClampedArray.[height, width, channels].const floatTensor = tensorFromImageData.toFloat().div(tf.scalar(255));
Тензоры позволяют выполнять операции с пикселями напрямую, без обращения к Canvas API. Например, инверсия цветов:
const invertedTensor = tf.tidy(() => {
return tf.sub(tf.scalar(1), normalizedTensor);
});
Здесь используется tf.sub для вычитания каждого значения
пикселя из 1.
Другой пример — конвертация изображения в оттенки серого:
const grayscaleTensor = tf.tidy(() => {
const [r, g, b] = tf.split(normalizedTensor, 3, 2);
return r.mul(0.299).add(g.mul(0.587)).add(b.mul(0.114));
});
tf.split разделяет тензор по каналу.TensorFlow.js поддерживает 2D свёртки, что позволяет создавать фильтры для обработки изображений, например размытие или выявление границ:
const kernel = tf.tensor2d([
[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]
], [3, 3]);
const kernel4D = kernel.expandDims(2).expandDims(3);
const batchedTensor = normalizedTensor.expandDims(0); // [1, height, width, channels]
const filtered = tf.conv2d(batchedTensor, kernel4D, 1, 'same').squeeze();
Важно:
[batch, height, width, channels].[filterHeight, filterWidth, inChannels, outChannels].squeeze() возвращает тензор к исходной
размерности.После обработки тензора его можно отобразить на Canvas:
const outputTensor = filtered.mul(255).toInt();
await tf.browser.toPixels(outputTensor, canvas);
tf.browser.toPixels автоматически преобразует тензор
[height, width, channels] в формат
ImageData.Работа с изображениями может быстро расходовать память. Для управления рекомендуется использовать:
tf.tidy — автоматически удаляет промежуточные
тензоры.tensor.dispose() для больших
объектов.Предобработка данных для модели классификации изображений:
tf.image.resizeBilinear.Реализация фильтров изображений на клиентской стороне:
Обработка потокового видео:
<video> и
tf.browser.fromPixels для анализа каждого кадра.Работа с пикселями через тензоры позволяет объединять мощь GPU с удобством JavaScript и Canvas API, создавая высокопроизводительные веб-приложения для обработки изображений и машинного обучения.