1

IT学校のプロジェクトで助けを求めています。衛星写真から道路を検出できるプログラムを作成する必要があります。私たちのグループは、エッジを検出する関数を使用することにしました。インターネットでさまざまなソリューションとフィルターを検索し、Sobel フィルターを使用することにしました。

このフィルターを Scala に実装しようとしましたが、うまくいきませんでした。私たちはさまざまな Web ページを使用して支援しています。これらのいくつかは StackOverflow にあります (こちら)。これを使用してコードを翻訳してみます: Ruby の Sobel フィルター

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 を学んだので役に立ちません。申し訳ありませんが、私の英語は完璧ではないので、正しく書いていない場合はご容赦ください。

4

1 に答える 1

2

あなたのソリューションのすべての詳細を把握しているかどうかはわかりませんが、とにかくここにいくつかの観察があります:

  1. varの代わりにvalを使用することを検討してください。Scala は不変を優先し、これらの変数を実際に変更することはありません。
  2. scala では、ネストされた for サイクルを 2 つの変数に対する単一のサイクルとして記述できます (詳細については、こちらを確認してください: Scala でのネストされた反復)。コードがすっきりすると思います。
  3. image2Dは、画像を保持している配列の配列であると思いますネストされた for ループの最後の行で、現在のピクセル値を変更しています。後で a,b,..,h,i 値を計算するときに同じピクセルにアクセスするため、これは良くありません。現在の反復中の中心ピクセルは、次の反復中のサイド ピクセルです。結果を別のマトリックスに書くべきだと思います。
于 2015-11-22T14:53:13.560 に答える