假设我有这个 image :
我想将灰度转换为 viridis 颜色模式并保存。我已经使用这段代码让它工作了:
system('wget https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Von_einem_Schrecklichen_vnd_Wunderbarlichen_Cometen_so_sich_den_Dienstag_nach_Martini_dieses_lauffenden_M._D._Lxxvij._Jahrs_am_Himmel_erzeiget_hat_%28grayscale%29.png/320px-thumbnail.png')
library(png)
library(viridisLite)
x <- png::readPNG('320px-thumbnail.png')
x <- x[, ,1]
intmat <- x * 255
image(1:nrow(intmat), 1:ncol(intmat), intmat, col=viridis(256))
结果如下:
我对颜色方案的应用方式非常满意。然而,这已经不再是原来的图像,而只是一个情节。我想要的是交换灰度中的每个像素,并将转换后的图像再次保存为 png,因此不使用 image()
。我查看了 magick 中的 image_convert 函数,但不知道如何获得所需的行为。
最佳答案
我确信有办法做到这一点,而无需重新发明轮子,但仅使用您已加载的库,操作 viridis 颜色以将它们分成 3 个 channel 并另存为 png 是相当简单的。
这是一个可以为任何 png 执行此操作的函数:
png_to_viridis <- function(in_file, out_file)
{
PNG_raw <- readBin(in_file, "raw", 10e6)
x <- png::readPNG(PNG_raw)
intmat <- 255 * x[, ,1]
virmat <- viridisLite::viridis(256)[intmat + 1]
virmat <- c(substr(virmat, 2, 3), substr(virmat, 4, 5),
substr(virmat, 6, 7), substr(virmat, 8, 9))
virmat <- as.numeric(as.hexmode(virmat))/255
dim(virmat) <- c(dim(intmat), 4)
png::writePNG(virmat, out_file)
}
所以现在如果我这样做:
png_to_viridis("https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Von_einem_Schrecklichen_vnd_Wunderbarlichen_Cometen_so_sich_den_Dienstag_nach_Martini_dieses_lauffenden_M._D._Lxxvij._Jahrs_am_Himmel_erzeiget_hat_%28grayscale%29.png/320px-thumbnail.png",
"viridis.png")
我得到以下结果,另存为 viridis.png:
关于r - 将灰度图像转换并保存为例如绿色配色方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61460482/