将图像读入数组?

时间:2018-03-03 17:29:21

标签: fortran gfortran sobel

我试图编写一个利用sobel滤镜检测图像边缘的程序。首先,我已经在一些基本代码中写下了一些要求,例如x和y方向过滤器作为数组,并尝试读取pgm图像:

program edges
implicit none
integer, dimension(:,:), allocatable :: inp, outim, GX, GY
integer, parameter :: dp = selected_real_kind(15,300)
integer :: ky, kx, x, y, out_unit = 10, M, N, sx, sy, i, j
real(kind=dp) :: G
M = 5
N = 5

allocate(inp(M,N))
allocate(outim(M-2,N-2))
allocate(GX(3,3))
allocate(GY(3,3))

open(file = 'clown.pgm',unit=out_unit,status= 'unknown') !opening file to         write to inp
read (out_unit,11) 'P2'      !pgm magic number
read (out_unit,12) 50,50     !width, height
read (out_unit,13) 1      !max gray value
do M=-25,25
    do N=-25,25
        read (out_unit,*) inp(M,N)
    end do
end do
11 format(a2)
12 format(i3,1x,i3)
13 format(i5)

这是我第一次在FORTRAN中处理图像处理,除了我将图像作为pbm文件打印出来之外。读取图像的代码是我以前打印过的代码的复制品,除了我改为写入读取。

所以我的问题是,我怎样才能将pgm格式的图像读入" inp"数组,以便我可以应用sobel滤波器?当我尝试运行时,出现以下错误:

read (out_unit,11) 'P2'      !pgm magic number
              1
Error: Expected variable in READ statement at (1)
sobel.f90:41:18:

 read (out_unit,12) 50,50     !width, height
              1
Error: Expected variable in READ statement at (1)
sobel.f90:42:18:

 read (out_unit,13) 1      !max gray value
              1
Error: Expected variable in READ statement at (1)

谢谢

1 个答案:

答案 0 :(得分:1)

第一个错误是,正如编译器非常清楚地说明的那样:

read (out_unit,11) 'P2'

编译器期望,因为这是定义Fortran的方式,被告知要将out_unit中的值读入变量,但'P2'是一个字符文字(或者其他)标准称它们为heck),它是一个字符串,它不是一个变量。

同样的错误也出现在下一行中。编译器需要像

这样的东西
integer :: p2  ! pgm magic number
...
read (out_unit,11) p2

。执行此版本的read语句后,变量p2保存从pgm文件中读取的幻数。

在我写作的同时,调用要从out_unit读取的单位是不正常的,最终会让你感到困惑。