0

I'm working on MODIS NDVI composite data (single band). I converted the image to a numpy array and performed filtering operations. When i'm saving the new numpy array as an image I get a 3 band image instead of single band image. How can I save it as a single band image?

#read an image
img = cv2.imread("D:/trial/MOD09_NDVI.A2017001.tif")

cv2.namedWindow('Unfiltered Image', cv2.WINDOW_NORMAL)

cv2.imshow('Unfiltered Image',img)

cv2.waitKey(0)

#apply filter
myIMG = cv2.blur(img, (5,5))

cv2.namedWindow('Blur Image', cv2.WINDOW_NORMAL)

cv2.imshow('Blur Image', myIMG)

cv2.waitKey(0)

scipy.misc.imsave('D:/trial/blur_55.tif', myIMG)

------------
scipy.misc.imsave('D:/trial/blur_55.tif', myIMG)

saves a 3 band image instead of original single band image

BERA
  • 72,339
  • 13
  • 72
  • 161
  • I would recommend rasterio. Check this out: https://gis.stackexchange.com/a/129868/8104 – Aaron Apr 10 '18 at 02:00

2 Answers2

1

Why are you using for saving Scipy? I think you can use function imwrite from CV2.

For example:

cv2.imwrite('D:/trial/blur_55.tif', myIMG)

or you can use also another libraries. For exammple PIL or Matplotlib.

Example for Matplotlib:

from matplotlib import pyplot as plt
plt.imshow(myIMG)
plt.show()
Grixus
  • 91
  • 4
  • I was using imwrite as well but I needed to assign spatial references as well. I ended up using GDAL functions for it. Thank you for the reply – Mangesh Deshpande Feb 16 '18 at 09:54
1

You can use the gdal driver.Create(filename, xsize, ysize, [bands], [data_type], [options]) function.

For example:

from osgeo import gdal

driver = gdal.GetDriverByName('GTiff')
out_ds = driver.Create('raster.tif', array.shape[0], array.shape[1], 1)
out_band = out_ds.GetRasterBand(1)

out_band.WriteArray(array)
out_ds.FlushCache()

del out_ds, out_band
Marcelo Villa
  • 5,928
  • 2
  • 19
  • 38