#python #r #image #tensorflow #normalize
#python #r #изображение #tensorflow #нормализовать
Вопрос:
Новичок в машинном обучении здесь!
Я пытаюсь нормализовать изображения в R
, поскольку планирую отправить их для классификации в пакете машинного обучения для классификации изображений дикой природы ( MLWIC
) в R.
Авторы пакета упоминают, что перед классификацией изображений их размер должен быть изменен до 256 x 256 пикселей (достаточно просто), а затем нормализован. Они ссылаются на методы, доступные в этом приложении (Norouzzadeh et al 2018, код здесь)).
Вкратце, процедура нормализации выполняется с помощью команды python, которая для каждого цветового канала в изображении «Вычитает среднее значение и делит на дисперсию пикселей».
В документации к функции python, которую они использовали, tf.image.per_image_standardization()
говорится:
Линейно масштабирует изображение, чтобы оно имело нулевое среднее значение и единичную дисперсию. Эта операция вычисляет (x — mean) / adjusted_stddev , где mean — среднее значение всех значений в изображении, а adjusted_stddev = max (stddev, 1.0 / sqrt (image.numElements())).
Если я пытаюсь воспроизвести этот процесс в R
. Однако, когда я пытаюсь переписать tf.image.per_image_standardization()
функцию в R, она изменяет изображение с диапазона [0,1] в каждом цветовом канале на диапазон, который составляет, например, от -1,85 до 1,85. Результирующее изображение не похоже на насыщенное изображение, отображаемое в приложении, ссылка на которое приведена выше.
Вот исходное изображение:
Вот обработанное изображение, как оно должно выглядеть:
Код, который я пробовал:
library(imager)
library(tidyverse)
ante <- load.image("original.jpg")
plot(ante)
normalize <- function(x) (x - mean(x))/sd(x)
ante %>%
imsplit("c") %>%
modify_at(1, normalize) %>%
modify_at(2, normalize) %>%
modify_at(3, normalize) %>%
imappend("c") %>%
plot()
Я также попробовал следующее, результирующее изображение выглядит более насыщенным, чем исходное, но в нем не используется среднее значение или sd…
library(magick)
process_image <- function(image.path, new.image.path){
tryCatch(
{
image_write(image_equalize(image_scale(image_read(image.path),"256x256!")), path = new.image.path)
return(substr(image.path, nchar(image.path) - 2, nchar(image.path)))
},
error = function(e)
{
return(NA)
}
)
}
process_image("original.jpg", "processed.jpg")
Что я делаю не так?
Комментарии:
1. Возможно, я что-то пропустил, но почему вопрос помечен как python?
2. Спасибо Jacques,
tensorflow
этоpython
библиотека, поэтому я хочу, чтобы пользователи python это увидели.