Estoy intentando calcular el color promedio de una imagen en Scala, donde "promedio" se define como rojoSum/numpixels, greenSum/numpixels, blueSum/numpixels.Scala: ¿forma idiomática de calcular sumas de matriz intercalada?
Aquí está el código que estoy usando para calcular el color promedio en una región rectangular de una imagen (el Raster).
// A raster is an abstraction of a piece of an image and the underlying
// pixel data.
// For instance, we can get a raster than is of the upper left twenty
// pixel square of an image
def calculateColorFromRaster(raster:Raster): Color = {
var redSum = 0
var greenSum = 0
var blueSum = 0
val minX = raster.getMinX()
val minY = raster.getMinY()
val height = raster.getHeight()
val width = raster.getWidth()
val numPixels = height * width
val numChannels = raster.getNumBands()
val pixelBuffer = new Array[Int](width*height*numChannels)
val pixels = raster.getPixels(minX,minY,width,height,pixelBuffer)
// pixelBuffer now filled with r1,g1,b1,r2,g2,b2,...
// If there's an alpha channel, it will be r1,g1,b1,a1,r2,... but we skip the alpha
for (i <- 0 until numPixels) {
val redOffset = numChannels * i
val red = pixels(redOffset)
val green = pixels(redOffset+1)
val blue = pixels(redOffset+2)
redSum+=red
greenSum+=green
blueSum+=blue
}
new Color(redSum/numPixels, greenSum/numPixels, blueSum/numPixels)
}
¿Hay una manera Scala más idiomática de resumir sobre las diferentes matrices intercaladas? ¿Alguna manera de obtener una proyección sobre la matriz que itera sobre cada 4º elemento? Estoy interesado en cualquier experiencia que la comunidad de Stack Overflow pueda brindar.
respuesta perfecta. Esta respuesta también me ayudó a comprender mejor cómo funciona foldLeft. El uso de la declaración de caso también lo hace muy legible. Bravo – I82Much
¿Cuál es la mejor manera de manejar el hecho de que el valor agrupado no siempre es 3, sino que es igual al número de canales, que podría ser 3 o 4 según el valor alfa? Siempre quiero índices de 0,1,2, pero en ese caso me imagino que no podría hacer un Arreglo de caso (r, g, b) ya que no siempre tengo una matriz de 3 elementos. pixels.grouped (numChannels) .foldLeft ((0,0,0)) {case ((rsum, gsum, bsum), colores: Array [Int]) => (rsum + colors (0), gsum + colors (1), bsum + colors (2))} – I82Much
@Sandor: No veo por qué quiere los resultados acumulativos (es decir, sumas sobre solo píxeles al principio). –