首页 > 其他分享 >使用Scala语言实现基本图像识别

使用Scala语言实现基本图像识别

时间:2024-11-24 12:11:00浏览次数:4  
标签:图像识别 语言 val Scala image BufferedImage jpg 图像

Scala是一种静态类型、函数式和面向对象的编程语言,它运行在JVM上,并且与Java高度兼容。Scala语言在数据处理和并发编程方面非常强大,下面是使用Scala语言实现Sobel边缘检测的代码示例。

代码实现
为了实现图像处理,我们将使用javax.imageio.ImageIO类来读取和保存图像,同时使用java.awt.image.BufferedImage来进行图像的操作。

scala
更多内容访问ttocr.com或联系1436423940
import java.awt.image.BufferedImage
import javax.imageio.ImageIO
import java.io.File

object EdgeDetection {

// Sobel算子
val sobelX: Array[Int] = Array(-1, 0, 1, -2, 0, 2, -1, 0, 1)
val sobelY: Array[Int] = Array(-1, -2, -1, 0, 0, 0, 1, 2, 1)

// 加载图像
def loadImage(path: String): BufferedImage = {
ImageIO.read(new File(path))
}

// 灰度化处理
def toGray(image: BufferedImage): BufferedImage = {
val grayImage = new BufferedImage(image.getWidth, image.getHeight, BufferedImage.TYPE_BYTE_GRAY)
grayImage.getGraphics.drawImage(image, 0, 0, null)
grayImage
}

// 卷积操作
def applySobel(image: BufferedImage, kernel: Array[Int]): BufferedImage = {
val width = image.getWidth
val height = image.getHeight
val outputImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY)

for (y <- 1 until height - 1) {
  for (x <- 1 until width - 1) {
    var gx = 0
    var gy = 0
    var index = 0

    for (ky <- -1 to 1) {
      for (kx <- -1 to 1) {
        val pixel = new java.awt.Color(image.getRGB(x + kx, y + ky))
        val gray = (pixel.getRed + pixel.getGreen + pixel.getBlue) / 3
        gx += gray * kernel(index)
        gy += gray * kernel(index + 1)
        index += 1
      }
    }
    val magnitude = math.sqrt(gx * gx + gy * gy).toInt
    val clampedValue = math.min(255, magnitude)
    outputImage.setRGB(x, y, new java.awt.Color(clampedValue, clampedValue, clampedValue).getRGB)
  }
}

outputImage

}

// 保存图像
def saveImage(image: BufferedImage, path: String): Unit = {
ImageIO.write(image, "jpg", new File(path))
}

def main(args: Array[String]): Unit = {
// 加载输入图像
val inputImage = loadImage("input_image.jpg")

// 灰度化处理
val grayImage = toGray(inputImage)

// 应用Sobel算子
val gradXImage = applySobel(grayImage, sobelX)
val gradYImage = applySobel(grayImage, sobelY)

// 保存输出图像
saveImage(gradXImage, "output_image_x.jpg")
saveImage(gradYImage, "output_image_y.jpg")

println("边缘检测完成,输出保存为 output_image_x.jpg 和 output_image_y.jpg")

}
}
步骤解析
加载图像
loadImage函数通过ImageIO.read方法读取图像文件,并将其返回为BufferedImage对象。

灰度化处理
toGray函数将图像转换为灰度图像,通过调用BufferedImage.TYPE_BYTE_GRAY来生成灰度图。

应用Sobel算子
applySobel函数执行卷积操作,使用Sobel算子分别计算图像在水平和垂直方向上的梯度。每个像素的梯度由其周围像素与Sobel算子的内积计算得出。

保存图像
saveImage函数将处理后的图像保存为JPEG文件。

示例输出
程序将输入图像进行边缘检测,分别保存水平方向(output_image_x.jpg)和垂直方向(output_image_y.jpg)的边缘图像。

运行方式
安装并配置Scala开发环境。
将上述代码保存为 EdgeDetection.scala 文件。
在build.sbt中添加必要的依赖:
scala

libraryDependencies += "org.scala-lang" % "scala-library" % "2.13.8"
运行Scala程序:
bash

scala EdgeDetection.scala

标签:图像识别,语言,val,Scala,image,BufferedImage,jpg,图像
From: https://www.cnblogs.com/ocr12/p/18565643

相关文章

  • 扫雷游戏升级版 含递归链式展开(一次展开一片区域) 代码详细解读 C语言
    1、前言:我看了CSDN有很多小伙伴也写了扫雷小游戏但是大部分写的代码都是一次输入坐标只能展开一个位置并没有还原我们小时候最初始的游戏玩法可玩性很低 我在这用函数递归链式展开一片还原最初始游戏提高可玩性 先放效果图↓2、建议:一个程序代码的实现并不是只靠......
  • 大一机械学生自学C语言50天的历程与心得
    1、迷茫自高考结束后 直到填报志愿前我都没有找到我感兴趣的专业方向 看到身边的朋友学医学机械学生物学计算机学数学甚至是生物化学 大部分都是在高中时就展现出一定的兴趣报志愿果断填报而我为了好的就业就只好志愿全填工科类专业  也如愿以偿的被录取到......
  • 2024年11月17日 星期天 Go语言基础
    今日格言坚持每天进步一点点~一个人也可以是一个团队~学习全栈开发,做自己喜欢的产品~~Go语言的创始人Go语言的创始人有三位,分别是:RobertGriesemer:他参与开发了JavaHotSpot虚拟机。RobPike:他是Go语言项目的总负责人,曾是贝尔实验室Unix团队的成员,参与过Plan9、Inf......
  • C语言嵌入式编程实战指南(二):高级技术和最佳实践
    引言在前一篇指南中,我们介绍了嵌入式系统的基础知识、C语言编程以及简单的项目开发流程。本篇将继续深入探讨高级技术主题,包括但不限于多任务编程、网络通信、硬件抽象层(HAL)的使用,以及一些实用的最佳实践建议。第一部分:高级编程技术1.1实时操作系统(RTOS)与多任务管......
  • 大语言模型(LLM)的训练微调 Fine Tuning -- part3 本地调用
    以下代码示范如何调用已经微调后的大语言模型,调用本地模型先决条件已经有了本地训练好的大语言模型,如何训练可以参考我的博文《生成式AI》课程作业6大语言模型(LLM)的训练微调FineTuning--part2-CSDN博客文章浏览阅读148次,点赞2次,收藏2次。代码围绕一个主工作目录展开,......
  • 《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part2
    资料来自李宏毅老师《生成式AI》课程,如有侵权请通知下线IntroductiontoGenerativeAI2024Spring来源背景说明该文档主要介绍了国立台湾大学(NTU)2024年春季“生成式人工智能(GenAI)”课程的作业5(GenAIHW5)相关内容,包括任务概述、待办事项、解码参数、提交与评分、参考......
  • 40分钟学 Go 语言高并发:Context包与并发控制
    Context包与并发控制学习目标知识点掌握程度应用场景context原理深入理解实现机制并发控制和请求链路追踪超时控制掌握超时设置和处理API请求超时、任务限时控制取消信号传播理解取消机制和传播链优雅退出、资源释放context最佳实践掌握使用规范和技巧工程实践中的常见场......
  • 用C语言写一个扫雷游戏
    如图这是我们常见的扫雷游戏的界面。为了实现扫雷游戏,我们借助一个二维的数组来实现,我们可以通过在二维数组里填充数字0来表示该处没有雷,填充1来表示该处有地雷。但是如图所示显示界面我们并不能看见此处到底是1或者0,一个数组我们不可能让其既填充0或1又让其填充别的字符来起......
  • go语言的成神之路-筑基篇-第一章
    目录第一节-家族的屈辱第二节-初见go语言第三节-初识gin框架 GET请求​编辑 POST请求 PUT请求DELETE请求第四节-template的初识main函数代码html代码效果展示  第五节-总结LOGO在这个设计中,引入了一只更加优雅的绿色蜥蜴(Gopher),它身披金色斗篷,手持象征......
  • 5- R语言基本图形绘制之箱线图——基于ggplot2
    使用语言自带数据集mpg,不明白字段含义的可以执行?mpg查询1并列箱线图(跨组比较)比较四缸、六缸和八缸汽车每加仑汽油行驶英里数(因为五缸车很少,所以删除五缸车的数据)。还要将year和cyl从连续性数值变量转化为分类(分组)因子。cars<-mpg[mpg$cyl!=5,]cars$Cylinders<-factor(ca......