无法使用ImageMagick创建NDVI图像

无法使用ImageMagick创建NDVI图像,imagemagick,imagemagick-convert,Imagemagick,Imagemagick Convert,我有四个独立的图像-,和。这是四幅陆地卫星图像。图2-projected.tif对应蓝色通道,图3-projected.tif对应绿色通道,图4-projected.tif对应红色通道,图5-projected.tif对应红外通道。现在我想创建NDVI图像。为此,我首先使用ImageMagic创建一个组合RGB图像: $ convert 4-projected.tif 3-projected.tif 2-projected.tif -combine RGB.tif 到目前为止,一切顺利。然后我

我有四个独立的图像-,和。这是四幅陆地卫星图像。图2-projected.tif对应蓝色通道,图3-projected.tif对应绿色通道,图4-projected.tif对应红色通道,图5-projected.tif对应红外通道。现在我想创建NDVI图像。为此,我首先使用ImageMagic创建一个组合RGB图像:

$ convert 4-projected.tif 3-projected.tif 2-projected.tif -combine RGB.tif
到目前为止,一切顺利。然后我试着按照教程中的命令,创建NDVI图像。我是这样做的:

$ convert 5-projected.tif RGB.tif -channel RGB -fx '(u.r-v.r)/(u.r+v.r+0.001)' -normalize NDVI.tif
但结果是,我收到以下错误消息:

转换:无法分析表达式
(u.r-1.0*v.r)'@error/fx.c/FxGetSymbol/183
1.
转换:除以零
'(u.r-1.0*v.r)/(u.r+v.r+0.001)'@error/fx.c/FxEvaluat eSubexpression/2159


我不知道如何解决它。

两个感兴趣的波段是
红色和
近红外
,NDVI的公式是:

NDVI = (NIR-red)/(NIR+red)

你有两个选择。首先,如果在两个单独的单通道图像中有红色和NIR,则可以执行以下操作:

convert red.tif NIR.tif -fx '(u.r-v.r)/(u.r+v.r+0.001)' -normalize -compress lzw NDVI.tif
这里,我使用
u.r
表示第一个图像的第一个通道,使用
v.r
表示第二个图像的第一个通道


或者,如果红色和NIR是RGB图像中的前两个通道(即,ImageMagick将它们称为红色和绿色通道):

这里我使用
u.r
来指代第一幅图像的第一个通道,使用
u.g
来指代第一幅图像的第二个通道


-fx
方法非常强大,但速度非常慢。下面这个方法应该给你同样的答案,但我没有仔细检查:

convert 4-projected.tif -write MPC:red +delete           \
        5-projected.tif -write MPC:NIR +delete           \
       \( mpc:red mpc:NIR -evaluate-sequence subtract \) \
       \( mpc:red mpc:NIR -evaluate-sequence add      \) \
       -evaluate-sequence divide -normalize -compress lzw NDVI.tif

如果你想用假颜色给图像着色,你可以生成一个颜色查找表(CLUT),并将NDVI图像中的灰度值映射到这些颜色。假设你想把NDVI图像中最暗的黑色映射为黑色,比较暗的值映射为红色,比较亮的值映射为橙色,最亮的值映射为绿色,你可以这样做:

convert xc:black xc:red xc:orange xc:lime +append clut.png
convert NDVI.tif -normalize clut.png -clut falsecolour.jpg

并应用上面的灰度结果,如下所示:

convert xc:black xc:red xc:orange xc:lime +append clut.png
convert NDVI.tif -normalize clut.png -clut falsecolour.jpg

如果要使橙色和绿色调变长(更普遍),可以在CLUT中更改其长度使其变长:

convert -size 30x1 xc:black -size 40x1 xc:red -size 80x1 xc:orange -size 100x1 xc:lime +append clut.png
convert NDVI.tif -normalize clut.png -clut result.jpg

然后重新应用CLUT:

convert -size 30x1 xc:black -size 40x1 xc:red -size 80x1 xc:orange -size 100x1 xc:lime +append clut.png
convert NDVI.tif -normalize clut.png -clut result.jpg

两个感兴趣的波段是
红色和
近红外波段,NDVI的公式为:

NDVI = (NIR-red)/(NIR+red)

你有两个选择。首先,如果在两个单独的单通道图像中有红色和NIR,则可以执行以下操作:

convert red.tif NIR.tif -fx '(u.r-v.r)/(u.r+v.r+0.001)' -normalize -compress lzw NDVI.tif
这里,我使用
u.r
表示第一个图像的第一个通道,使用
v.r
表示第二个图像的第一个通道


或者,如果红色和NIR是RGB图像中的前两个通道(即,ImageMagick将它们称为红色和绿色通道):

这里我使用
u.r
来指代第一幅图像的第一个通道,使用
u.g
来指代第一幅图像的第二个通道


-fx
方法非常强大,但速度非常慢。下面这个方法应该给你同样的答案,但我没有仔细检查:

convert 4-projected.tif -write MPC:red +delete           \
        5-projected.tif -write MPC:NIR +delete           \
       \( mpc:red mpc:NIR -evaluate-sequence subtract \) \
       \( mpc:red mpc:NIR -evaluate-sequence add      \) \
       -evaluate-sequence divide -normalize -compress lzw NDVI.tif

如果你想用假颜色给图像着色,你可以生成一个颜色查找表(CLUT),并将NDVI图像中的灰度值映射到这些颜色。假设你想把NDVI图像中最暗的黑色映射为黑色,比较暗的值映射为红色,比较亮的值映射为橙色,最亮的值映射为绿色,你可以这样做:

convert xc:black xc:red xc:orange xc:lime +append clut.png
convert NDVI.tif -normalize clut.png -clut falsecolour.jpg

并应用上面的灰度结果,如下所示:

convert xc:black xc:red xc:orange xc:lime +append clut.png
convert NDVI.tif -normalize clut.png -clut falsecolour.jpg

如果要使橙色和绿色调变长(更普遍),可以在CLUT中更改其长度使其变长:

convert -size 30x1 xc:black -size 40x1 xc:red -size 80x1 xc:orange -size 100x1 xc:lime +append clut.png
convert NDVI.tif -normalize clut.png -clut result.jpg

然后重新应用CLUT:

convert -size 30x1 xc:black -size 40x1 xc:red -size 80x1 xc:orange -size 100x1 xc:lime +append clut.png
convert NDVI.tif -normalize clut.png -clut result.jpg

顺便说一句,NDVI公式在理论上看起来像
(NIR-VIS)/(NIR+VIS)
(根据维基百科),我还看到了其他一些创建NDVI的ImageMagic命令。例如,在这篇文章中——他们的计算方式类似于
-fx'(u.r-u.g)/(u.r+u.g+0.001)
顺便说一句,NDVI公式在理论上看起来类似于
(NIR-VIS)/(NIR+VIS)
(根据维基百科),我还看到了一些其他ImageMagic命令来创建NDVI。例如,在这篇文章中--他们计算它就像
-fx'(u.r-u.g)/(u.r+u.g+0.001)
谢谢!我马上查!我将在一分钟内添加一个更快的方法-等等。我不知道为什么,但我仍然收到这个“无法解析(u.r-1.0*u.g)”错误消息。这个错误似乎与任务本身无关。你不在Windows上,是吗?如果是,请在
-fx
表达式周围使用双引号而不是单引号。你说得对!整个问题都在单引号中!非常感谢你的回答!谢谢我马上查!我将在一分钟内添加一个更快的方法-等等。我不知道为什么,但我仍然收到这个“无法解析(u.r-1.0*u.g)”错误消息。这个错误似乎与任务本身无关。你不在Windows上,是吗?如果是,请在
-fx
表达式周围使用双引号而不是单引号。你说得对!整个问题都在单引号中!非常感谢你的回答!