2015-11-21 6 views
1

Я ищу некоторую помощь в проекте ИТ-школы. Нам нужно создать программу, которая может обнаруживать дороги на спутниковой фотографии. Наша группа решила использовать функцию для обнаружения краев. Мы ищем различные решения и фильтры в Интернете, и мы решим использовать фильтр Sobel.Scala реализация фильтра 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 -- 

Изображение, возвращенное этой реализацией, представляет собой изображение с черно-белыми пикселями, и я не знаю почему. У меня нет опыта обработки изображений, и мы изучили Scala 8 недель назад, так что это не помогает. Прошу прощения, мой английский не идеален, поэтому, пожалуйста, простите меня, если я не буду писать правильно.

+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. изучить возможность использования Вал с вместо вар с: Scala предпочитает immutables и вы не действительно изменяя любую из этих переменных.
  2. В scala вы можете написать вложенные для циклов как одну одну над двумя переменными (проверьте здесь подробности: Nested iteration in Scala). Я думаю, что он делает код чище.
  3. Я предполагаю image2D - массив массивов, в котором вы находитесь , держа изображение. В последней строке вашего цикла вложенного цикла вы изменяете значение текущего пикселя . Это не хорошо, потому что вы получите доступ к тому же самому пикселу при вычислении значений a, b, .., h, i . Центральным пикселем во время текущей итерации является боковой пиксель во время следующей итерации. Я думаю, вы должны написать результат в другой матрице .
+0

Спасибо, Чомос. Я создал новое прозрачное изображение с одинаковой высотой и шириной, и оно работает! Для замены моих варов я предпочитаю ждать, потому что проект не завершен, но я держу это в своем уме. –

Смежные вопросы