如何调整RGB栅格的饱和度与亮度并保存为TIF格式?
调整RGB栅格的饱和度与亮度并保存为TIF
你可以通过RGB转HSV色彩空间的方式调整饱和度(S通道)和亮度(V通道),再转回RGB格式保存,以下是基于raster和terra包的实现方案:
方法一:使用raster包
library(raster) # 你的原始代码 r <- raster(ncol=10, nrow=10) set.seed(1) r1 <- setValues(r, rpois(100, 150)) r2 <- setValues(r, rpois(100, 200)) r3 <- setValues(r, rpois(100, 150)) r <- stack(r1, r2, r3) names(r)=c("R","G","B") # 1. 将栅格值归一化到0-1区间(适配色彩空间转换要求) r_norm <- stack(lapply(r, function(x) x / max(values(x)))) # 2. 提取RGB像素值并转换为HSV空间 rgb_matrix <- as.matrix(r_norm) hsv_matrix <- rgb2hsv(rgb_matrix[,1], rgb_matrix[,2], rgb_matrix[,3]) # 3. 调整饱和度和亮度 saturation_coeff <- 1.5 # >1增加饱和度,<1降低饱和度 brightness_coeff <- 1.2 # >1提升亮度,<1降低亮度 # 确保调整后数值不超出HSV的0-1范围 hsv_matrix["s", ] <- pmin(hsv_matrix["s", ] * saturation_coeff, 1) hsv_matrix["v", ] <- pmin(hsv_matrix["v", ] * brightness_coeff, 1) # 4. 转换回RGB格式 new_rgb_matrix <- hsv2rgb(hsv_matrix) # 5. 赋值回栅格并调整为图像兼容的0-255整数格式 new_r <- r values(new_r) <- t(new_rgb_matrix) new_r <- round(new_r * 255) dataType(new_r) <- "INT1U" # 设置为8位无符号整数 # 6. 保存为TIF writeRaster(new_r, "adjusted_rgb.tif", format="GTiff", overwrite=TRUE)
方法二:使用terra包(推荐,处理大栅格更高效)
library(terra) # 将raster对象转换为terra的SpatRaster r_terra <- rast(r) # 1. 归一化到0-1区间 r_norm <- r_terra / max(values(r_terra)) # 2. 提取像素值并转HSV空间 rgb_vals <- values(r_norm) hsv_vals <- rgb2hsv(rgb_vals[,1], rgb_vals[,2], rgb_vals[,3]) # 3. 调整参数 s_coeff <- 1.5 b_coeff <- 1.2 hsv_vals["s", ] <- pmin(hsv_vals["s", ] * s_coeff, 1) hsv_vals["v", ] <- pmin(hsv_vals["v", ] * b_coeff, 1) # 4. 转回RGB并赋值回栅格 new_rgb_vals <- t(hsv2rgb(hsv_vals)) new_r_terra <- r_terra values(new_r_terra) <- round(new_rgb_vals * 255) datatype(new_r_terra) <- "INT1U" # 5. 保存为TIF writeRaster(new_r_terra, "adjusted_rgb_terra.tif", format="GTiff", overwrite=TRUE)
关键说明
- 归一化步骤是必须的:
rgb2hsv函数要求输入值在0-1区间,因此需要先将原始栅格的数值缩放至该范围。 - 数值范围限制:调整后用
pmin确保HSV通道值不超过1,避免色彩失真。 - 图像格式适配:将最终值转回0-255的8位整数,符合TIF图像的常规存储格式。
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

