Tôi đang cố gắng tính màu trung bình của hình ảnh trong Scala, trong đó "trung bình" được định nghĩa là redSum/numpixels, greenSum/numpixels, blueSum/numpixels.Scala - cách thành ngữ để tính tổng các mảng xen kẽ?
Đây là mã tôi đang sử dụng để tính màu trung bình trong vùng hình chữ nhật của hình ảnh (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)
}
Có cách Scala thành ngữ tổng hợp hơn các mảng xen kẽ khác nhau không? Một số cách để có được một phép chiếu trên mảng lặp qua tất cả các phần tử thứ 4? Tôi quan tâm đến bất kỳ chuyên môn nào mà cộng đồng Stack Overflow có thể cung cấp.
Perfect câu trả lời. Câu trả lời này cũng giúp tôi hiểu rõ hơn cách foldLeft hoạt động. Việc sử dụng các tuyên bố trường hợp cũng làm cho nó rất dễ đọc. Bravo – I82Much
Cách tốt nhất để xử lý thực tế là giá trị được nhóm không phải lúc nào cũng là 3, nhưng thay vào đó bằng số kênh, có thể là 3 hoặc 4 tùy thuộc vào giá trị alpha? Tôi luôn luôn muốn 0,1,2 chỉ số, nhưng trong trường hợp đó tôi tưởng tượng tôi không thể làm một trường hợp Array (r, g, b) nữa vì tôi không luôn luôn có một mảng 3 phần tử. pixel.giao diện (numChannels) .foldLeft ((0,0,0)) {case ((rsum, gsum, bsum), màu sắc: Array [Int]) => (rsum + colors (0), gsum + colors (1), bsum + colors (2))} – I82Much
@Sandor: Tôi không thấy lý do tại sao bạn muốn kết quả tích lũy (tức là tổng chỉ trên các pixel trong phần đầu). –