在做ref="/tag/184/" style="color:#B2A89E;font-weight:bold;">图像处理时,经常会遇到需要从大量像素点中筛选出符合条件的数据。比如一张灰度图里,只想保留亮度值大于128的像素,这时候用 Scala 的 filter 函数就特别顺手。
理解 filter 的基本用法
filter 是 Scala 集合类型的一个高阶函数,它接收一个返回布尔值的函数作为参数,把原集合中满足条件的元素留下,不满足的剔除。
val pixels = List(45, 90, 130, 160, 200, 80)
val brightPixels = pixels.filter(p => p > 128)
// 结果:List(130, 160, 200)
上面这段代码就像给照片做“提亮”预处理,只留下较亮的部分,方便后续分析边缘或轮廓。
处理二维像素矩阵
真实图像往往是二维结构,可以用嵌套列表表示。假设我们有一个 3x3 的灰度图,想找出所有高亮区域的坐标。
val image = List(
List(100, 150, 200),
List(80, 120, 180),
List(130, 140, 110)
)
val hotspots = image.zipWithIndex.flatMap { case (row, y) =>
row.zipWithIndex.filter { case (value, x) => value > 128 }
.map { case (value, x) => (x, y, value) }
}
// 输出:List((1,0,150), (2,0,200), (2,1,180), (0,2,130), (1,2,140))
这样就能拿到所有“热点”位置和亮度值,适合用来标记异常区域或者准备特征提取。
结合颜色图像的多通道筛选
如果是彩色图像,每个像素包含 RGB 三个值。我们可以用 filter 找出偏红的像素点。
case class Pixel(r: Int, g: Int, b: Int)
val colorImage = List(
Pixel(200, 100, 100),
Pixel(80, 180, 90),
Pixel(220, 120, 110),
Pixel(70, 80, 150)
)
val redDominant = colorImage.filter(p => p.r > p.g + p.b / 2)
// 留下红色分量明显更高的像素
这种逻辑可以用于识别交通灯、警示标志等特定颜色目标,在图像识别前期处理中很实用。
实际项目中,把这些过滤后的数据传给后续算法,能有效减少计算量,提升响应速度。尤其是在实时视频处理场景下,提前筛掉无关信息,系统负担小多了。