Нормализация изображения в R с использованием среднего значения и стандартного отклонения

#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. Результирующее изображение не похоже на насыщенное изображение, отображаемое в приложении, ссылка на которое приведена выше.

Вот исходное изображение:

animal_original

Вот обработанное изображение, как оно должно выглядеть:

введите описание изображения здесь

Код, который я пробовал:

 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 это увидели.