2015-11-21 78 views
1

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

我们试图在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,所以这没有帮助。 对不起,我的英文不完善,请原谅我,如果我没写错。

+0

你会期望结果是什么?在您与问题链接的其中一个示例中,Sobel运算符应用程序的输出也由黑白像素组成。 – tkroman

+0

我们期望的结果是一个带有边缘的新图像。 源图像:http://www.koenigguillaume.me/6.jpg 结果:http://www.koenigguillaume.me/outputImage.jpg 但结果是尼特好,我在这个新的图像没有边缘像这里:http://stackoverflow.com/questions/17815687/image-processing-implementing-sobel-filter。 –

回答

2

我不知道我抓住你的解决方案的所有细节,反正这里的一些观察:

  1. 考虑使用VAL s,而不是VAR S:斯卡拉喜欢 immutables,你是不是真正改变任何这些变数。
  2. 在scala中,你可以编写嵌套循环,作为单个变量,两个变量 (详情请查看: Nested iteration in Scala)。我认为它使代码更清洁。
  3. 我假设image2D是阵列的阵列,其中您是 保存您的图像。在嵌套for循环的最后一行,您可以更改当前像素值 。这是不好的,因为当你计算你的a,b,..,h, 值时,你会在 后面访问相同的像素。当前迭代期间的中心像素是下一次迭代期间的侧像素 。我认为你应该在 不同的矩阵中写出结果。
+0

谢谢Chomos。我创建了一个具有相同高度和宽度的新透明图像,它的工作原理! 为了更换我的变量,我更愿意等待,因为项目并不完整,但我始终坚持这一点。 –