R语言中RGB图像数组与HSL/HSV色彩空间快速双向转换方法
R中大尺寸图像RGB与HSL/HSV快速双向转换方案
你之前的代码效率低的核心原因是使用了R层的循环/迭代操作,对千万级像素的图像来说会产生极高的调用开销,推荐使用底层C/C++实现的向量化转换方案:
方案1:使用farver包(性能最优,推荐)
farver是专门为高性能颜色空间转换开发的R包,支持RGB与HSL、HSV等数十种颜色空间的双向转换,全程底层运算无R层循环,4000万像素(5000×8000)的双向转换耗时可控制在3秒以内。
使用示例:
# 安装包(仅第一次运行需要) install.packages("farver") library(jpeg) library(farver) # 读取JPG图像,输出为(宽度, 高度, 3)的三维数组,值范围0-1 img <- readJPEG(img_path) # 将三维数组拉平为n行3列的矩阵,每行对应一个像素的R、G、B值 img_rgb_mat <- matrix(img, ncol = 3) # RGB转HSL,若输入值范围为0-255可添加参数value_range = c(0, 255) img_hsl_mat <- convert_colour(img_rgb_mat, from = "rgb", to = "hsl") # 转换回原维度的三维数组(宽度, 高度, 3),通道顺序为H、S、L img_hsl <- array(img_hsl_mat, dim = dim(img)) # -------------------------- # 此处添加你对HSL图像的修改逻辑 # -------------------------- # 修改完成后转回RGB img_hsl_mod_mat <- matrix(img_hsl, ncol = 3) img_rgb_mod_mat <- convert_colour(img_hsl_mod_mat, from = "hsl", to = "rgb") # 限制数值范围在0-1避免溢出 img_rgb_mod_mat <- pmax(pmin(img_rgb_mod_mat, 1), 0) # 转回三维数组 img_rgb_mod <- array(img_rgb_mod_mat, dim = dim(img)) # 保存为JPG writeJPEG(img_rgb_mod, "modified_image.jpg", quality = 0.95)
如果需要转换为HSV空间,只需将上述代码中的to = "hsl"和from = "hsl"替换为to = "hsv"和from = "hsv"即可。
方案2:使用内置grDevices包(无需额外安装)
R内置的grDevices包自带rgb2hsv和hsv函数,支持RGB和HSV的向量化转换,无需安装第三方包,性能略低于farver,但也远高于R层循环。
使用示例:
library(jpeg) library(grDevices) img <- readJPEG(img_path) # 拆分R、G、B通道为向量 r <- as.vector(img[,,1]) g <- as.vector(img[,,2]) b <- as.vector(img[,,3]) # RGB转HSV,输出为3行n列的矩阵,行顺序为H、S、V img_hsv_mat <- rgb2hsv(r, g, b, maxColorValue = 1) # 转换回三维数组 img_hsv <- array(t(img_hsv_mat), dim = dim(img)) # -------------------------- # 此处添加你对HSV图像的修改逻辑 # -------------------------- # 修改完成后转回RGB img_hsv_mod_mat <- t(matrix(img_hsv, ncol = 3)) img_rgb_mod_mat <- t(hsv( h = img_hsv_mod_mat[1,], s = img_hsv_mod_mat[2,], v = img_hsv_mod_mat[3,], maxColorValue = 1 )) # 限制数值范围 img_rgb_mod_mat <- pmax(pmin(img_rgb_mod_mat, 1), 0) img_rgb_mod <- array(img_rgb_mod_mat, dim = dim(img)) writeJPEG(img_rgb_mod, "modified_image.jpg")
内容的提问来源于stack exchange,提问作者Zoe
相关产品推荐
相关产品推荐

