我有一些成像数据具有非常微弱的对比度和相当多的噪音,当我用线性色标显示它时,它显示不好。在像imageJ或photoshop这样的成像软件中,有一个色调曲线可以调整,以非线性的方式突破对比度,并有效地拉伸某些感兴趣区域的比例,以查看更多细节。
作为这种非线性调整参数的最简单情况,@ BrianDiggs指出了bias
colorRamp
的{{1}}参数,它仍然需要先将数据转换为[0,1]。
我想将非线性比例推广到除x^gamma
之外的其他函数,因此下面的函数实际上并不使用bias
中的colorRamp
,而是在数据端进行转换。
我觉得我正在重新发明轮子;在R中是否已经有这样一种连续色标的工具?
答案 0 :(得分:0)
这是一个可能的解决方案,
set.seed(123)
x <- sort(runif(1e4, min=-20 , max=120))
library(scales) # rescale function
curve_pal <- function (x, colours = rev(blues9),
fun = function(x) x^gamma,
n=10, gamma=1)
{
# function that maps [0,1] -> colours
palfun <- colorRamp(colors=colours)
# now divide the data in n equi-spaced regions, mapped linearly to [0,1]
xcuts <- cut(x, breaks=seq(min(x), max(x), length=n))
xnum <- as.numeric(xcuts)
# need to work around NA values that make colorRamp/rgb choke
testNA <- is.na(xnum)
xsanitised <- ifelse(testNA, 0, fun(rescale(xnum)))
# non-NA values in [0,1] get assigned their colour
ifelse(testNA, NA, rgb(palfun(xsanitised), maxColorValue=255))
}
library(gridExtra)
grid.newpage()
grid.arrange(rasterGrob(curve_pal(x, gamma=0.5), wid=1, heig=1, int=F),
rasterGrob(curve_pal(x, gamma=1), wid=1, heig=1, int=F),
rasterGrob(curve_pal(x, gamma=2), wid=1, heig=1, int=F),
nrow=1)