我正在尝试编写一个函数,将所有图像放在文件位置并对其应用另一个函数(具体来说,将高斯模糊与不同的sigma应用于每个图像,然后将每个图像写入相同的位置)。 / p>
require(EBImage)
blurpics=function(pics.location){
x=list.files(pics.location)
y=length(x)
for (i in x) {
for (j in y) {
blurpic=function(x,y){
pic=readImage(x)
pic1=gblur(pic,sigma=16.9)
pic2=gblur(pic,sigma=15.3)
pic3=gblur(pic,sigma=13.75)
pic4=gblur(pic,sigma=12.25)
pic5=gblur(pic,sigma=10.8)
pic6=gblur(pic,sigma=9.4)
pic7=gblur(pic,sigma=8.05)
pic8=gblur(pic,sigma=6.75)
pic9=gblur(pic,sigma=5.5)
pic10=gblur(pic,sigma=4.3)
pic11=gblur(pic,sigma=3.15)
pic12=gblur(pic,sigma=2.05)
pic13=gblur(pic,sigma=1)
writeImage(pic1,paste(y,"_01.jpg",sep=""),quality=70)
writeImage(pic2,paste(y,"_02.jpg",sep=""),quality=70)
writeImage(pic3,paste(y,"_03.jpg",sep=""),quality=70)
writeImage(pic4,paste(y,"_04.jpg",sep=""),quality=70)
writeImage(pic5,paste(y,"_05.jpg",sep=""),quality=70)
writeImage(pic6,paste(y,"_06.jpg",sep=""),quality=70)
writeImage(pic7,paste(y,"_07.jpg",sep=""),quality=70)
writeImage(pic8,paste(y,"_08.jpg",sep=""),quality=70)
writeImage(pic9,paste(y,"_09.jpg",sep=""),quality=70)
writeImage(pic10,paste(y,"_10.jpg",sep=""),quality=70)
writeImage(pic11,paste(y,"_11.jpg",sep=""),quality=70)
writeImage(pic12,paste(y,"_12.jpg",sep=""),quality=70)
writeImage(pic13,paste(y,"_13.jpg",sep=""),quality=70)
#}
}
}
}
一个问题是该函数仅适用于文件位置中的一个图像.--- 更新:baptiste指出逻辑错误
更重要的是,如何更有效地重写此功能,以便我不必单独定义每个pic变量?
答案 0 :(得分:1)
就初始问题而言,你可能想要的这类任务是lapply()
- 它需要一个列表并将函数应用于每个元素。据推测,您也希望能够将相对高斯模糊水平考虑在内。为此,您需要一个列表,其中每个元素包含两个项目;文件名和模糊程度。所以:
#List files
vector_of_file_names <- list.files(pics.location)
#List gaussian blur levels
gaussian_blur <- c(1,2,3,4)
#And now apply!
lapply(vector_of_file_names, function(x){
#"x" is the filename
pic <- readImage(x[[1]])
for(i in seq_along(gaussian_blur)){
#Apply gaussian blurring.
pic = gblur(puc, sigma = gaussian_blur[i])
#Write out
writeImage(pic, paste(i, "blurred",x, sep = ""), quality = 70)
}
})
希望这会有所帮助。通常答案是&#34;我已经嵌套了for循环&#34;将会有一个for循环/应用函数在一个向量列表上运行,而不是一个向量&#34;。
答案 1 :(得分:0)
从OP移动我的解决方案:在baptiste的帮助下,这是我最初寻求的解决方案,并向Ironholds寻求替代解决方案:
blurpic=function(pics.location){
require(EBImage)
require(tools)
x=list.files(pics.location)
sigma=c(16.9,15.3,13.75,12.25,10.8,9.4,8.05,6.75,5.5,4.3,3.15,2.05,1)
for (i in seq_along(x)) {
for(j in seq_along(sigma)) {
pic=readImage(x[i])
pic1=gblur(pic,sigma=sigma[j])
#writeImage(pic1,paste(file_path_sans_ext(x[i]),j,".jpg",sep=""),quality=70)
writeImage(pic1,paste(i,"_",j,".jpg",sep=""),quality=70)
}
}
}
注意:我已根据原始文件名或按顺序命名添加了两个writeImage命名方法。