subroutine
で受け取った配列の形を知りたい
fortran90でラプラシアンフィルタを実装しようと思い、以下のサブルーチンを作成しました。
fortran
1subroutine laplacian(img, output, width, height) 2 !!! laplacian filtering (8 neighborhood) 3 !!! input: 4 !!! img(integer, 2D): array. have pix value. 5 !!! output(integer, 2D): array for output. 6 !!! width(integer): image width. 7 !!! height(integer): image height. 8 9 implicit none 10 integer, dimension(width, height), intent(in) :: img 11 integer, dimension(width, height), intent(out) :: output 12 integer :: width, height 13 integer :: filter(3, 3) = reshape((/1, 1, 1, 1, -8, 1, 1, 1, 1/), shape(filter)) 14 integer :: w, h 15 16 do w = 1, width 17 do h = 1, height 18 if (w == 1 .or. w == width .or. h == 1 .or. h == height) then 19 output(h, w) = img(h, w) 20 else 21 output(h, w) = max(0, min(255, sum(img(h - 1:h + 1, w - 1:w + 1)*filter)), 0) 22 end if 23 end do 24 end do 25end subroutine laplacian
引数としてimg
のサイズを渡しているのですが、この部分をなくしたいです。
イメージとしては以下のようになります。
fortran
1subroutine laplacian(img, output) 2 !!! laplacian filtering (8 neighborhood) 3 !!! input: 4 !!! img(integer, 2D): array. have pix value. 5 !!! output(integer, 2D): array for output. 6 7 implicit none 8 integer, ?? :: img ! 9 integer, dimension(shape(img)) :: output ! 10 11 integer :: width, height = shape(img) 12 integer :: filter(3, 3) = reshape((/1, 1, 1, 1, -8, 1, 1, 1, 1/), shape(filter)) 13 integer :: w, h 14 15 do w = 1, width 16 do h = 1, height 17 if (w == 1 .or. w == width .or. h == 1 .or. h == height) then 18 output(h, w) = img(h, w) 19 else 20 output(h, w) = max(0, min(255, sum(img(h - 1:h + 1, w - 1:w + 1)*filter)), 0) 21 end if 22 end do 23 end do 24end subroutine laplacian
試してみたこと
img
の宣言をallocatable
にした状態でshape(img)
をする- 受け取った
img
とは違う形状が出力されました
- 受け取った
環境
Manharo Linux
コンパイラ: gfortran
どのように書けば所望の動作をするでしょうか?
ご教授よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。