Noob机器学习者在这里!
我正试图对R
中的图像进行规范化,因为我打算将其提交到R中的用于野生生物图像分类的机器学习(MLWIC
)包中
该软件包的作者提到,在对图像进行分类之前,应将它们调整为256 x 256像素(足够容易),然后进行规格化。他们引用了本附录(Norouzzadeh et al 2018,code here)中可用的方法。
简而言之,归一化过程是使用python命令执行的,该命令针对图像中的每个颜色通道“减去均值并除以像素的方差”。
他们使用的python函数的文档,tf.image.per_image_standardization()
指出:
线性缩放图像以使其均值和单位方差为零。 该操作会计算(x-平均值)/ Adjusted_stddev,其中mean是图像中所有值的平均值,并且Adjusted_stddev = max(stddev,1.0 / sqrt(image.NumElements()))。
如果我尝试在R
中复制此过程。但是,当我尝试重写R中的tf.image.per_image_standardization()
函数时,它将图像从每个颜色通道中的[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")
我在做什么错了?