def build_multiband_image(rootDIR, outName, newfoldername, find, drivercode, ndvalue): outdir = create_output_dir(rootDIR, newfoldername) print "\nOutputting files to : {0}".format(outdir) print "\nFinding HDF files in directory/subfolders: {0}".format(rootDIR) hdfs = find_files(rootDIR, ".hdf") print "\tFound {0} files.".format(len(hdfs)) print "\nGetting images to process of type {0}...".format(find) toprocess = [] for hdf in hdfs: sds = get_hdf_subdatasets(hdf) for ds in sds: if find.upper() in ds[1].upper(): toprocess.append(ds[0]) print "\t\t{0}".format(ds[0]) bands = len(toprocess) print "\tFound {0} images of type {1}.".format(bands, find) print "\nGetting output parameters..." rows, cols, datatype, geotransform, projection = open_image(toprocess[0]) print "\tParameters: rows: {0}, cols: {1}, datatype: {2}, projection: {3}.".format(rows, cols, datatype, projection) outfile = os.path.join(outdir, outName) + ".tif" print "\nOutput file is: {0}".format(outfile) outds = create_output_raster(outfile, cols, rows, bands, datatype, drivername=drivercode) print "\tCreated output file." print"\nAdding bands to output file..." for i in range(0, bands): print "\tProcessing band {0} of {1}...".format(i + 1, bands) image = gdal.Open(toprocess[i]) band = image.GetRasterBand(1) outband = outds.GetRasterBand(i + 1) print "\t\tReading band data to array..." data = band.ReadAsArray(0, 0, cols, rows) print "\t\tWriting band data to output band..." outband.WriteArray(data, 0, 0) outband.SetNoDataValue(ndvalue) outband.FlushCache() del data, outband image = "" print "\tFinished adding bands to output file." print "\nSetting transform and projection..." outds.SetGeoTransform(geotransform) outds.SetProjection(projection) outDS = "" print "\nProcess completed."
def get_incorrect_px_curves(inputpath, referencepath, vitimeseriespath, startdoy, interval, outputpath=None, nodata=None): if not outputpath: root = os.path.dirname(inputpath) outputpath = create_output_dir(root, "plots") #Open images inputimage = build_multiband_image.open_image(inputpath, returnimage=True) referenceimage = build_multiband_image.open_image(referencepath, returnimage=True) timeseries = build_multiband_image.open_image(vitimeseriespath, returnimage=True) #Get band 1 of input and reference images and read as arrays inband = inputimage[5].GetRasterBand(1) inarray = inband.ReadAsArray(0, 0, inputimage[0], inputimage[1]) inband = "" refband = referenceimage[5].GetRasterBand(1) refarray = refband.ReadAsArray(0, 0, referenceimage[0], referenceimage[1]) refband = "" #Close in and ref images #Find unique values in the input image uniquevals = set(np.unique(inarray).tolist()) uniquevals.remove(nodata) print uniquevals #Iterate through pixels in images, comparing arrays for each value in input image, making note of tested values and excluding them from comparison with 0 value in input image #Return pixel coordinates and the identified and true identities of the pixels from the input and reference images coordinatelist = {} for value in uniquevals: coordinatelist[value] = [] numincorrect = 0 for col in range(0, inputimage[0]): for row in range(0, inputimage[1]): if (inarray[row, col] != 0) and (inarray[row, col] != refarray[row, col]) and (inarray[row, col] != nodata): if refarray[row, col] in uniquevals: coordinatelist[refarray[row, col]].append([col, row, inarray[row, col], refarray[row, col]]) numincorrect += 1 else: coordinatelist[0].append([col, row, inarray[row, col], refarray[row, col]]) numincorrect += 1 elif (inarray[row,col] == 0) and (refarray[row, col] in uniquevals): coordinatelist[refarray[row, col]].append([col, row, inarray[row, col], refarray[row, col]]) numincorrect += 1 #For each returned pixel, extract and plot the curve from vitimeseries and export plot as image; be sure to label plot correctly bandcnt = timeseries[5].RasterCount arrays = {} for i in range(1, bandcnt + 1): band = timeseries[5].GetRasterBand(i) data = band.ReadAsArray(0, 0, timeseries[0], timeseries[1]) arrays[i] = data print("Found {0} incorrect pixels to process...".format(numincorrect)) plotvalues = [] i = 0 for group, pixels in coordinatelist.items(): for pixel in pixels: pxvalues = {} for key, val in arrays.items(): doy = interval * (key - 1) + startdoy if doy >= 366: t = floor((doy - 366)/interval) doy = interval * t + 366 pxvalues[doy] = val[pixel[1], pixel[0]] color = color_picker(i) pixel.append(pxvalues) pixel.append(color) plotvalues.append(pixel) i += 1 pdf = PdfPages(os.path.join(outputpath, "plots.pdf")) for pixel in plotvalues: figure = plot_pixel(pixel, outputpath, color=pixel[5]) pdf.savefig() plt.close(figure) pdf.close()