首页 文章

Scala实现了sobel滤波器

提问于
浏览
1

我正在寻找IT学校项目的一些帮助 . 我们需要创建一个可以在卫星照片中检测道路的程序 . 我们小组决定使用一个函数来检测边缘 . 我们在互联网上搜索不同的解决方案和过滤器,我们决定使用Sobel过滤器 .

我们已经尝试在Scala中实现此过滤器,但它不起作用 . 我们使用不同的网页来帮助我们,其中一些是在StackOverflow(here)上 . 我们使用这个来帮助我们并尝试翻译代码:Sobel filter in Ruby .

Start Code --

codeGrey(); // This function transform the RGB in grey level

  var sobel_x: Array[Array[Double]] = Array(
    Array(-1, 0, 1),
    Array(-2, 0, 2),
    Array(-1, 0, 1))

  var sobel_y: Array[Array[Double]] = Array(
    Array(1, 2, 1),
    Array(0, 0, 0),
    Array(-1, -2, 1))

  for (x <- 1 to wrappedImage.height - 2) {
    for (y <- 1 to wrappedImage.width - 2) {

      var a = (image2D(x - 1)(y - 1) & 0x00FF0000) >> 16
      var b = (image2D(x)(y - 1) & 0x00FF0000) >> 16
      var c = (image2D(x + 1)(y - 1) & 0x00FF0000) >> 16
      var d = (image2D(x - 1)(y) & 0x00FF0000) >> 16
      var e = (image2D(x)(y) & 0x00FF0000) >> 16
      var f = (image2D(x + 1)(y) & 0x00FF0000) >> 16
      var g = (image2D(x - 1)(y + 1) & 0x00FF0000) >> 16
      var h = (image2D(x)(y + 1) & 0x00FF0000) >> 16
      var i = (image2D(x + 1)(y + 1) & 0x00FF0000) >> 16

      var pixel_x =
        (sobel_x(0)(0) * a) + (sobel_x(0)(1) * b) + (sobel_x(0)(2) * c) +
          (sobel_x(1)(0) * d) + (sobel_x(1)(1) * e) + (sobel_x(1)(2) * f) +
          (sobel_x(2)(0) * g) + (sobel_x(2)(1) * h) + (sobel_x(2)(2) * i);
      var pixel_y =
        (sobel_y(0)(0) * a) + (sobel_x(0)(1) * b) + (sobel_x(0)(2) * c) +
          (sobel_y(1)(0) * d) + (sobel_x(1)(1) * e) + (sobel_x(1)(2) * f) +
          (sobel_y(2)(0) * g) + (sobel_x(2)(1) * h) + (sobel_x(2)(2) * i);

      var res = (Math.sqrt((pixel_x * pixel_x) + (pixel_y *     pixel_y)).ceil).toInt

      image2D(x)(y) = 0xFF000000 + (res * 65536 + res * 256 + res);

    }
  }

End Code --

此实现返回的图像只是一个黑白像素的图像,我不知道为什么 . 我没有图像处理方面的经验,我们在8周前学过Scala,所以这没有帮助 . 对不起,我的英文不完美所以如果我没写得不对,请原谅我 .

1 回答

  • 2

    我不确定我是否掌握了解决方案的所有细节,无论如何这里有一些观察:

    • 考虑使用 val 而不是 var :Scala更喜欢不可变,你并没有真正改变任何这些变量 .

    • 在scala中,您可以在两个变量上将循环嵌套作为单个循环(有关详细信息,请单击此处:Nested iteration in Scala) . 我认为它使代码更清晰 .

    • 我认为 image2D 是您要保存图像的数组数组 . 在嵌套for循环的最后一行中,您将更改当前像素值 . 这样做并不好,因为稍后在计算a,b,..,h,i值时将访问同一像素 . 当前迭代期间的中心像素是下一次迭代期间的侧像素 . 我想你应该把结果写成不同的矩阵 .

相关问题