多波段影像镶嵌异常:预期双波段输出却得到单波段问题排查
I'm trying to mosaic two multi-band images, expecting a single file with two bands as output, but I end up with a single-band output instead. Here's the code I used:
A11 <- brick("E:/Official/PROJECTS/R_Progrm/1.tif") # Read multi-band image B11 <- brick("E:/Official/PROJECTS/R_Progrm/3.tif") # Read multi-band image mos1 <- mosaic(A11,B11,fun=max,tolerance=0.5, filename="Mosaic_new",overwrite=TRUE) plot(mos1,main="Mosaic_new1") writeRaster(x=mos1,file="E:/Official/PROJECTS/R_Progrm/M11.tif",options="INTERLEAVE=...")
What's Causing the Issue?
The problem here boils down to how the mosaic() function in the raster package handles multi-band brick objects. When you pass two multi-band bricks straight to mosaic(), it doesn’t treat them as paired sets of bands—it treats every single band from both files as a separate input layer. So if each of your inputs has 2 bands, you’re actually feeding 4 individual layers into the function. The fun=max argument then crunches all 4 layers down to a single band by taking the maximum value at each pixel across all layers, which is why you’re getting that unexpected single-band output.
How to Fix It (Preserve 2-Band Output)
To keep your original 2-band structure, you need to mosaic the corresponding bands from each input separately, then combine the results back into a single brick. Here are two simple approaches:
Method 1: Mosaic Bands One by One
Extract each band from your input bricks, mosaic them as pairs, then merge the results:
library(raster) # Read your multi-band images A11 <- brick("E:/Official/PROJECTS/R_Progrm/1.tif") B11 <- brick("E:/Official/PROJECTS/R_Progrm/3.tif") # Mosaic the first band from both inputs mosaic_band1 <- mosaic(A11[[1]], B11[[1]], fun=max, tolerance=0.5) # Mosaic the second band from both inputs mosaic_band2 <- mosaic(A11[[2]], B11[[2]], fun=max, tolerance=0.5) # Combine the two mosaicked bands into a single 2-band brick mos1 <- brick(mosaic_band1, mosaic_band2) # Plot and save your final mosaic plot(mos1, main="Mosaic_new1") writeRaster(x=mos1, file="E:/Official/PROJECTS/R_Progrm/M11.tif", options="INTERLEAVE=BAND", overwrite=TRUE)
Method 2: Use lapply for Scalability
If you ever work with more than 2 bands, this method will save you from repeating code. It loops over each band index and mosaics the corresponding pairs automatically:
library(raster) A11 <- brick("E:/Official/PROJECTS/R_Progrm/1.tif") B11 <- brick("E:/Official/PROJECTS/R_Progrm/3.tif") # First, make sure both inputs have the same number of bands (critical!) stopifnot(nlayers(A11) == nlayers(B11)) # Mosaic each pair of bands using a loop mosaic_list <- lapply(1:nlayers(A11), function(band_num) { mosaic(A11[[band_num]], B11[[band_num]], fun=max, tolerance=0.5) }) # Convert the list of single-band mosaics into a multi-band brick mos1 <- brick(mosaic_list) # Plot and save plot(mos1, main="Mosaic_new1") writeRaster(x=mos1, file="E:/Official/PROJECTS/R_Progrm/M11.tif", options="INTERLEAVE=BAND", overwrite=TRUE)
Quick Tips
- Always double-check that your input bricks have the same number of bands using
nlayers()—this prevents mismatched band pairs that could break your code. - When saving with
writeRaster(), addingoptions="INTERLEAVE=BAND"ensures your output is stored in the standard band-interleaved format for multi-band rasters.
内容的提问来源于stack exchange,提问作者Raj Arya

