"평균"은 redSum/numpixels, greenSum/numpixels, blueSum/numpixels로 정의되는 Scala에서 이미지의 평균 색상을 계산하려고합니다.스칼라 - 인터리브 된 배열의 합계를 계산하는 관용적 방법?
다음은 이미지의 사각형 영역 (래스터)의 평균 색상을 계산하는 데 사용하는 코드입니다.
// 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)
}
다른 인터리브 어레이에 대해 더 자세히 설명하는 스칼라 방식이 있습니까? 모든 네 번째 요소를 반복하는 배열을 통해 투영을 얻는 방법은 무엇입니까? Stack Overflow 커뮤니티가 제공 할 수있는 전문 기술에 관심이 있습니다.
완벽한 대답을. 이 답변은 foldLeft가 어떻게 작동하는지 더 잘 이해할 수있게 도와주었습니다. case 문을 사용하면 매우 쉽게 읽을 수 있습니다. Bravo – I82Much
그룹화 된 값이 항상 3이 아닌 대신 알파 값에 따라 3 또는 4 인 채널 수와 동일하다는 사실을 처리하는 가장 좋은 방법은 무엇입니까? 항상 0,1,2 인덱스를 원하지만이 경우에는 항상 3 요소 배열을 가지고 있지 않기 때문에 더 이상 Array (r, g, b)를 수행 할 수 없다고 상상해보십시오. pixels.grouped (numChannels) .foldLeft ((0,0,0)) {case ((rsum, gsum, bsum), colors : Array [Int]) => (rsum + colors (0), gsum + colors (1), bsum + colors (2))} – I82Much
@Sandor : 왜 누적 결과가 필요한지 알지 못합니다. –