2015-11-21 76 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。我創建了一個具有相同高度和寬度的新透明圖像,它的工作原理! 爲了更換我的變量,我更願意等待,因爲項目並不完整,但我始終堅持這一點。 –