无法使用ImageMagick创建NDVI图像
我有四个独立的图像-,和。这是四幅陆地卫星图像。图2-projected.tif对应蓝色通道,图3-projected.tif对应绿色通道,图4-projected.tif对应红色通道,图5-projected.tif对应红外通道。现在我想创建NDVI图像。为此,我首先使用ImageMagic创建一个组合RGB图像:无法使用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 到目前为止,一切顺利。然后我
$ 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
表达式周围使用双引号而不是单引号。你说得对!整个问题都在单引号中!非常感谢你的回答!