无法使用ImageMagick创建NDVI图像

时间:2017-04-08 12:02:01

标签: imagemagick imagemagick-convert

我有四张单独的图片 - 2-projected.tif3-projected.tif4-projected.tif5-projected.tif。这些是四张Landsat图像。 Image 2-projected.tif对应蓝色通道,图像3-projection.tif-对应绿色通道,图像4-projection.tif对应红色通道,5-projection.tif-对应红外通道。现在我想创建NDVI图像。为此,我首先使用ImageMagic创建一个组合的RGB图像:

var original = [
{
        "productID": "C05M01P001",
        "productName": "Aashirvaad Atta - Whole Wheat (முழு கோதுமை)",
        "productUnit": "1 kg",
        "productPrice": "Rs.50.00",
        "productSellingPrice": "",
        "productSID": "",
        "productImage": "http://www.thechennaikart.com/image/cache/Product_Images_2016/asvd-attaplain-atta-large-500x500.jpg",
        "productDescription": "Ashirvaad Atta - Whole Wheat 1 kg..",
        "productCID": "C05",
        "productMID": "M01"
    }
];
var updated = original.reduce(function(obj, entry) {
  obj[entry.productID] = entry;
  return obj;
}, {});
console.log(updated);

到目前为止,这么好。然后我尝试按照this教程中的命令,该命令应该创建NDVI图像。我是这样做的:

$ convert 4-projected.tif 3-projected.tif 2-projected.tif -combine RGB.tif

但结果是,我收到以下错误消息:

  

convert:无法解析表达式$ 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)/(u.r + v.r + 0.001)''@ error / fx.c / FxEvaluat   eSubexpression / 2159。

我不知道如何解决它。

1 个答案:

答案 0 :(得分:2)

感兴趣的两个频段是redNIR,而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来引用第二张图片的第一个频道。

enter image description here

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

convert RGB.tif -fx '(u.r-u.g)/(u.r+u.g+0.001)' -normalize -compress lzw NDVI.tif

此处我使用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图像中最黑的黑色映射为黑色,将相当暗的值映射为红色,将相当明亮的值映射为橙色,将最亮的值映射为绿色,您可以将这样的CLUT映射为:

convert xc:black xc:red xc:orange xc:lime +append clut.png

enter image description here

并将上面的灰度结果应用于此:

convert NDVI.tif -normalize clut.png -clut falsecolour.jpg

enter image description here

如果你想让橙色和绿色的色调更长(更普遍),你可以改变它们的长度,使它们在CLUT中更长:

convert -size 30x1 xc:black -size 40x1 xc:red -size 80x1 xc:orange -size 100x1 xc:lime +append clut.png

enter image description here

然后重新应用CLUT:

convert NDVI.tif -normalize clut.png -clut result.jpg

enter image description here