gpt4 book ai didi

r - 使用 R 创建 "arty"马赛克图片(*非*统计马赛克图)

转载 作者:行者123 更新时间:2023-12-04 10:27:20 24 4
gpt4 key购买 nike

我想稍微处理一下图像,想知道 R 中是否有生成 的方法。马赛克图片喜欢 these .

我想背景图片可以使用 readJPEG (包 jpeg)和 rasterImage来自包裹 graphics .

但是我对如何计算和聚类颜色值等以排列前景图片迷失了方向。

编辑

我找到了这个 post这“朝着正确的方向”前进。但是我想如果您创建一个“真正的”马赛克,其中实际图片纯粹由小图片组成(而不是像 this example 那样组合背景和前景图片并找到合适的透明度),您有您需要数百甚至数千张图片的问题。

最佳答案

认为这是一个很好的挑战,可以浪费几个小时。这是概念函数的证明:

library(jpeg)
library(png)
library(plyr)

reduceCol <- function(x,dim=c(1,1))
{
arr <- array(dim=c(nrow(x),ncol(x),4))
cols <- col2rgb(c(x),alpha=TRUE)
arr[,,1] <- matrix(cols[1,],nrow(x),ncol(x),byrow=TRUE)
arr[,,2] <- matrix(cols[2,],nrow(x),ncol(x),byrow=TRUE)
arr[,,3] <- matrix(cols[3,],nrow(x),ncol(x),byrow=TRUE)
arr[,,4] <- matrix(cols[4,],nrow(x),ncol(x),byrow=TRUE)



Res <- array(dim=c(dim,4))
if (dim[1]>1) seqRows <- as.numeric(cut(1:nrow(x),dim[1])) else seqRows <- rep(1,nrow(x))
if (dim[2]>1) seqCols <- as.numeric(cut(1:ncol(x),dim[2])) else seqCols <- rep(1,ncol(x))


for (i in 1:dim[1])
{
for (j in 1:dim[2])
{
for (z in 1:4)
{
Res[i,j,z] <- mean(arr[seqRows==i,seqCols==j,z])
}
}
}
return(Res)
}

rgbarr2colmat <- function(mat)
{
Res <- array(dim=dim(mat)[1:2])
for (i in 1:dim(mat)[1])
{
for (j in 1:dim(mat)[2])
{
Res[i,j] <- rgb(mat[i,j,1],mat[i,j,2],mat[i,j,3],mat[i,j,4],maxColorValue=255)
}
}
return(Res)
}

artymosaic <- function(BG,pics,res=c(10,10))
{
BGreduced <- reduceCol(BG,res)
Picmeancol <- lapply(pics,reduceCol)

blockPic <- array(dim=res)
for (i in 1:res[1])
{
for (j in 1:res[2])
{
blockPic[i,j] <- which.min(sapply(Picmeancol,function(x)sum(abs(BGreduced[i,j,]-x))))
}
}
blockPic <- t(blockPic)
blockPic <- blockPic[,ncol(blockPic):1]

# Open empty plot:
par(mar=c(0,0,0,0))
plot(1,xlim=c(0,1),ylim=c(0,1),type="n",bty="n",axes=FALSE)

# plot moasics:
seqRows <- seq(0,1,length=res[1]+1)
seqCols <- seq(0,1,length=res[2]+1)
for (i in 1:res[1])
{
for (j in 1:res[2])
{
rasterImage(pics[[blockPic[i,j]]],seqRows[i],seqCols[j],seqRows[i+1],seqCols[j+1],interpolate=FALSE)
}
}
}
artymosaic使用光栅格式的背景作为第一个参数,光栅格式的图片列表作为第二个参数,分辨率 (numeric(2)) 作为第三个参数。

由计算机图片组成的带有 R 标志的示例。我下载了一些google的图片,上传到 http://sachaem47.fortyseven.versio.nl/files/pics/mosaic.zip .如果将这些提取到马赛克文件夹中,并在工作目录中下载 R 标志( http://cran.r-project.org/Rlogo.jpg ),我们可以制作“艺术马赛克”如下。
bg <- readJPEG("Rlogo.jpg")
BG <- as.raster(bg)

jpgs <- lapply(list.files("mosaic/",pattern="\\.jpg",full.names=TRUE),readJPEG)
pics <- lapply(jpgs,as.raster)

png("test.png")
artymosaic(BG,pics,c(50,50))
dev.off()

enter image description here

看起来很壮观吧?这里的主要缺点是我在适当的地方重用了相同的图像,而且我只使用了很少的图像。这可以改变,但需要更多的图像,这将导致函数运行更长时间。再次,概念证明。

关于r - 使用 R 创建 "arty"马赛克图片(*非*统计马赛克图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12252638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com