我正在尝试编写一个利用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)
谢谢
第一个错误是,正如编译器非常清楚地指出的那样,在这一行中:
read (out_unit,11) 'P2'
编译器期望,因为这是定义Fortran的方式,被告知将值从out_unit
读取到变量中,但是'P2'
是一个字符文字(或者标准如何称呼它们(,它是一个字符串,它不是一个变量。
同样的错误也发生在下一行中。 编译器期望类似
integer :: p2 ! pgm magic number
...
read (out_unit,11) p2
等等。 执行此版本的 read 语句后,变量p2
保存从pgm
文件中读取的幻数。
在我写作的时候,调用要从out_unit
中读取的单元只是反常的,最终会让你感到困惑。