示例#1
0
def erosion_filter(
    in_raster,
    width=3,
    iterations=1,
    circular=True,
    weighted_distance=True,
    sigma=3.5,
    _kernel=False,
):
    kernel = (_kernel if _kernel is not False else create_kernel(
        width,
        circular=circular,
        weighted_edges=True,
        weighted_distance=weighted_distance,
        sigma=sigma,
        normalise=False,
    ))
    if iterations == 1:
        return kernel_filter(in_raster, kernel,
                             "erode").astype(in_raster.dtype)
    else:
        result = kernel_filter(in_raster, kernel,
                               "erode").astype(in_raster.dtype)
        for _ in range(iterations - 1):
            result = kernel_filter(result, kernel,
                                   "erode").astype(in_raster.dtype)
        return result
示例#2
0
def mean_deviation_filter(
    in_raster,
    width=3,
    absolute_value=False,
    circular=True,
    weighted_edges=True,
    holed=True,
    weighted_distance=True,
    distance_calc="gaussian",
    sigma=2,
    dtype='float32',
    _kernel=False,
):
    kernel = (_kernel if _kernel is not False else create_kernel(
        width,
        circular=circular,
        holed=holed,
        weighted_edges=weighted_edges,
        weighted_distance=weighted_distance,
        distance_calc=distance_calc,
        sigma=sigma,
    ))
    result = in_raster - mean_filter(in_raster, _kernel=kernel)
    if absolute_value is True:
        return np.abs(result).astype(dtype)
    return result.astype(dtype)
示例#3
0
def fast_sum_filter(
    in_raster,
    width=3,
    circular=True,
    holed=False,
    weighted_edges=True,
    weighted_distance=False,
    distance_calc="gaussian",
    sigma=2,
    dtype=False,
    _kernel=False,
):
    kernel = (_kernel if _kernel is not False else create_kernel(
        width,
        circular=circular,
        holed=holed,
        normalise=False,
        weighted_edges=weighted_edges,
        weighted_distance=weighted_distance,
        distance_calc=distance_calc,
        sigma=sigma,
    ))

    # TODO: HANDLE NODATA
    # return fast_sum(in_raster, kernel).astype(in_raster.dtype)
    return scipy.signal.fftconvolve(in_raster, kernel,
                                    mode='same').astype(in_raster.dtype)
示例#4
0
def sum_filter(
    in_raster,
    width=3,
    circular=True,
    holed=False,
    weighted_edges=True,
    weighted_distance=False,
    distance_calc="gaussian",
    sigma=2,
    dtype=False,
    _kernel=False,
):
    kernel = (_kernel if _kernel is not False else create_kernel(
        width,
        circular=circular,
        holed=holed,
        normalise=False,
        weighted_edges=weighted_edges,
        weighted_distance=weighted_distance,
        distance_calc=distance_calc,
        sigma=sigma,
    ))

    if dtype is False:
        return kernel_filter(in_raster, kernel, "mean").astype(in_raster.dtype)

    return kernel_filter(in_raster, kernel, "mean").astype(dtype)
示例#5
0
def median_filter(
    in_raster,
    width=3,
    iterations=1,
    circular=True,
    holed=False,
    weighted_edges=True,
    weighted_distance=True,
    distance_calc="gaussian",
    sigma=2,
    dtype='float32',
    _kernel=False,
):
    kernel = (_kernel if _kernel is not False else create_kernel(
        width,
        circular=circular,
        holed=holed,
        weighted_edges=weighted_edges,
        weighted_distance=weighted_distance,
        distance_calc=distance_calc,
        sigma=sigma,
    ))

    if iterations == 1:
        return kernel_filter(in_raster, kernel, "median", dtype)
    else:
        result = kernel_filter(in_raster, kernel, "median", dtype)
        for _ in range(iterations - 1):
            result = kernel_filter(result, kernel, "median", dtype)
        return result
示例#6
0
def feather_s2_filter(tracking_image, value_to_count, width=21, circular=True):
    kernel = create_kernel(
        width,
        circular=circular,
        holed=False,
        normalise=False,
        weighted_edges=False,
        weighted_distance=False,
    )
    return feather_s2_array(tracking_image, value_to_count, kernel)
示例#7
0
def assess_radiometric_quality(metadata, calc_quality='high', score=False):
    if calc_quality == 'high':
        scl = raster_to_array(metadata['path']['20m']['SCL']).astype('intc')
        aot = raster_to_array(metadata['path']['20m']['AOT']).astype('intc')
        band_02 = raster_to_array(
            metadata['path']['20m']['B02']).astype('intc')
        band_12 = raster_to_array(
            metadata['path']['20m']['B12']).astype('intc')
        band_cldprb = raster_to_array(metadata['path']['QI']['CLDPRB_20m'])
        distance = 63
    else:
        scl = raster_to_array(metadata['path']['60m']['SCL']).astype('intc')
        aot = raster_to_array(metadata['path']['60m']['AOT']).astype('intc')
        band_cldprb = raster_to_array(metadata['path']['QI']['CLDPRB_60m'])
        band_02 = raster_to_array(
            metadata['path']['60m']['B02']).astype('intc')
        band_12 = raster_to_array(
            metadata['path']['60m']['B12']).astype('intc')
        distance = 21

    kernel_nodata = create_kernel(201,
                                  weighted_edges=False,
                                  weighted_distance=False,
                                  normalise=False).astype('uint8')

    # Dilate nodata values by 1km each side
    nodata_dilated = cv2.dilate((scl == 0).astype('uint8'),
                                kernel_nodata).astype('intc')

    darkprb = np.zeros(scl.shape)
    darkprb = np.where(scl == 2, 55, 0)
    darkprb = np.where(scl == 3, 45, darkprb).astype('uint8')
    darkprb = cv2.GaussianBlur(darkprb, (distance, distance),
                               0).astype(np.double)
    band_cldprb = cv2.GaussianBlur(band_cldprb, (distance, distance),
                                   0).astype(np.double)

    quality = np.zeros(scl.shape, dtype=np.double)

    td = 0.0 if score is True else metadata['time_difference'] / 86400

    # OBS: the radiometric_quality functions mutates the quality input.
    combined_score = radiometric_quality(scl, band_02, band_12, band_cldprb,
                                         darkprb, aot, nodata_dilated, quality,
                                         td, metadata['SUN_ELEVATION'])

    if score is True:
        return combined_score

    blur_dist = 31
    quality_blurred = cv2.GaussianBlur(quality, (blur_dist, blur_dist),
                                       0).astype(np.double)

    return quality_blurred, scl
示例#8
0
def cdef_difference_filter(
    in_raster_master,
    in_raster_slave,
    width=3,
    circular=True,
    holed=False,
    weighted_edges=True,
    weighted_distance=False,
    distance_calc="gaussian",
    sigma=2,
    dtype='float32',
    _kernel=False,
):
    kernel = (_kernel if _kernel is not False else create_kernel(
        width,
        circular=circular,
        holed=holed,
        normalise=True,
        weighted_edges=weighted_edges,
        weighted_distance=weighted_distance,
        distance_calc=distance_calc,
        sigma=sigma,
    ))

    master_mean = kernel_filter(in_raster_master, kernel, 'mean')
    slave_mean = kernel_filter(in_raster_slave, kernel, 'mean')

    master_median = kernel_filter(in_raster_master, kernel, "median")
    slave_median = kernel_filter(in_raster_slave, kernel, 'median')

    abs_median_diff = np.abs(master_median - slave_median)
    master_mean_difference = np.abs(master_mean -
                                    np.abs(master_median - slave_median))
    slave_mean_difference = np.abs(slave_mean -
                                   np.abs(master_median - slave_median))

    master_mad_std = kernel_filter(in_raster_master, kernel, 'mad_std')
    slave_mad_std = kernel_filter(in_raster_slave, kernel, 'mad_std')

    with np.errstate(divide='ignore', invalid='ignore'):
        zscores_master = (master_mean -
                          master_mean_difference) / master_mad_std
        zscores_master[master_mad_std == 0] = 0

        zscores_slave = (slave_mean - slave_mean_difference) / slave_mad_std
        zscores_slave[slave_mad_std == 0] = 0

    return np.min([zscores_master, zscores_slave], axis=0)
示例#9
0
def mode_filter(in_raster, width=5, iterations=1, circular=True):
    kernel = create_kernel(
        width,
        circular=circular,
        holed=False,
        normalise=False,
        weighted_edges=False,
        weighted_distance=False,
    )

    if iterations == 1:
        # return mode_array(in_raster, kernel)
        return majority(in_raster, kernel)
    else:
        # result = mode_array(in_raster, kernel)
        result = majority(in_raster, kernel)
        for x in range(iterations - 1):
            result = majority(result, kernel)
            # result = mode_array(result, kernel)
        return result
示例#10
0
def close_filter(
    in_raster,
    width=3,
    circular=True,
    weighted_distance=True,
    sigma=3.5,
    _kernel=False,
):
    kernel = (_kernel if _kernel is not False else create_kernel(
        width,
        circular=circular,
        weighted_edges=True,
        weighted_distance=weighted_distance,
        sigma=sigma,
        normalise=False,
    ))
    return kernel_filter(
        kernel_filter(in_raster, kernel, "dilate"),
        kernel,
        "erode",
    ).astype(in_raster.dtype)
示例#11
0
def kurtosis_filter(
    in_raster,
    width=3,
    circular=True,
    holed=False,
    weighted_edges=True,
    weighted_distance=True,
    distance_calc="gaussian",
    sigma=2,
    dtype='float32',
    _kernel=False,
):
    kernel = (_kernel if _kernel is not False else create_kernel(
        width,
        circular=circular,
        holed=holed,
        weighted_edges=weighted_edges,
        weighted_distance=weighted_distance,
        distance_calc=distance_calc,
        sigma=sigma,
    ))
    return kernel_filter(in_raster, kernel, "kurtosis", dtype)
示例#12
0
def snr_filter(
    in_raster,
    width=3,
    circular=True,
    weighted_edges=True,
    weighted_distance=True,
    distance_calc="gaussian",
    sigma=2,
    dtype="float32",
    _kernel=False,
):
    kernel = (_kernel if _kernel is not False else create_kernel(
        width,
        circular=circular,
        holed=True,
        weighted_edges=weighted_edges,
        weighted_distance=weighted_distance,
        distance_calc=distance_calc,
        sigma=sigma,
    ))
    return np.power(mean_filter(in_raster, _kernel=kernel),
                    2) / variance_filter(in_raster,
                                         _kernel=kernel).astype(dtype)
示例#13
0
def z_filter(
    in_raster,
    width=3,
    circular=True,
    holed=False,
    weighted_edges=True,
    weighted_distance=True,
    distance_calc="gaussian",
    sigma=2,
    dtype='float32',
    _kernel=False,
):
    kernel = (_kernel if _kernel is not False else create_kernel(
        width,
        circular=circular,
        holed=holed,
        weighted_edges=weighted_edges,
        weighted_distance=weighted_distance,
        distance_calc=distance_calc,
        sigma=sigma,
    ))
    return ((in_raster - mean_filter(in_raster, _kernel=kernel)) /
            standard_deviation_filter(in_raster, _kernel=kernel)).astype(dtype)
示例#14
0
sys.path.append('..')
from matplotlib import pyplot as plt
from lib.raster_io import raster_to_array, array_to_raster
from lib.stats_kernel import create_kernel

folder = 'C:\\Users\\caspe\\Desktop\\Data\\Sentinel1\\'
in_raster = f'{folder}accra_s1.tif'
out_figure = f'{folder}accra_s1_fkernel.png'
data = raster_to_array(in_raster)

kernel_size = 5
kernel = create_kernel(kernel_size,
                       circular=True,
                       weighted_edges=True,
                       inverted=False,
                       holed=False,
                       normalise=True,
                       weighted_distance=True,
                       sigma=2,
                       distance_calc='guassian',
                       plot=True).astype(np.float)

fig, ax = plt.subplots()

im = ax.imshow(kernel, cmap='bone_r', interpolation=None)  # no vmin=0, vmax=1

radius = kernel_size // 2
circle = plt.Circle((radius, radius),
                    radius + 0.5,
                    color='black',
                    fill=False,
                    linestyle='--')