sobel滤波器的Scala实现



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

我们曾尝试在Scala中实现这个过滤器,但没有成功。我们使用不同的网页来帮助我们,其中一些在StackOverflow上(此处)。我们用这个来帮助我们,并尝试翻译代码:Ruby中的Sobel filter。

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. 考虑使用vals而不是vars:Scala更喜欢immutables,而你并没有真正改变这些变量中的任何一个
  2. 在scala中,您可以将嵌套的for循环写成一个一对二变量(请查看此处了解详细信息:Scala中的嵌套迭代)。我认为这会使代码更干净
  3. 我假设image2D是您所在的数组保持你的形象。在嵌套for循环的最后一行中改变当前像素值。这不好,因为你会稍后在计算a、b、..时访问同一像素,。。,h、 我价值观当前迭代期间的中心像素为边像素在下一次迭代中。我认为你应该把结果写在不同的矩阵

相关内容

  • 没有找到相关文章

最新更新