加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala – 惯用的方法来计算交错数组的总和?

发布时间:2020-12-16 19:00:24 所属栏目:安全 来源:网络整理
导读:我正在尝试计算 Scala中图像的平均颜色,其中“average”被定义为redSum / numpixels,greenSum / numpixels,blueSum / numpixels. 以下是我用来计算图像矩形区域(光栅)的平均颜色的代码. // A raster is an abstraction of a piece of an image and the under
我正在尝试计算 Scala中图像的平均颜色,其中“average”被定义为redSum / numpixels,greenSum / numpixels,blueSum / numpixels.

以下是我用来计算图像矩形区域(光栅)的平均颜色的代码.

// 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,a1,... 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)
}

在不同的交错阵列上总结了一个比较惯用的Scala方法吗?一些方法可以在每个第四个元素上迭代数组的投影?我对Stack Overflow社区可以提供的任何专业知识感兴趣.

解决方法

pixel.grouped(3)将返回一个3元素数组的Iterator [Array [Int]].所以

val pixelRGBs = pixels.grouped(3)

val (redSum,greenSum,blueSum) = 
  pixelRGBs.foldLeft((0,0)) {case ((rSum,gSum,bSum),Array(r,g,b)) => (rSum + r,gSum + g,bSum + b)}

new Color(redSum / numPixels,blueSum / numPixels)

更新:要处理3和4通道,我会写

pixels.grouped(numChannels).foldLeft((0,b,_*)) => (rSum + r,bSum + b)}

_ *这里基本上是指“0或更多元素”.请参阅http://programming-scala.labs.oreilly.com/ch03.html中的“序列匹配”

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读