使用Scala語言實現基本影像識別

ttocr、com發表於2024-11-24

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

相關文章