将灰度图像转换并保存为例如绿配色方案

问题描述 投票:1回答:1

假设我有这个image

enter image description here

我想将灰度转换为绿颜色模式并保存。我已经使用下面的代码工作了:

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))

导致的结果:

enter image description here

我对颜色模式的应用感到非常满意。但是,这不再是原始图像,而只是一个情节。我想要的是交换灰度中的每个像素,然后将转换后的图像再次保存为png,因此无需使用image()。我看了magick中的image_convert函数,但无法弄清楚如何获得所需的行为。

r imagemagick rmagick
1个回答
2
投票

我敢肯定,有很多方法可以在不重新设计轮子的情况下进行,但是仅使用您已加载的库,就可以很容易地操作出绿色的颜色,将它们分成3个通道并另存为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:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.