def sieve(image, size, out=None, output=None, mask=None, connectivity=4): """ Replaces small polygons in `image` with the value of their largest neighbor. Polygons are found for each set of neighboring pixels of the same value. Parameters ---------- image : numpy ndarray or rasterio Band object (RasterReader, bidx namedtuple) Must be of type rasterio.int16, rasterio.int32, rasterio.uint8, rasterio.uint16, or rasterio.float32 size : int minimum polygon size (number of pixels) to retain. out : numpy ndarray, optional Array of same shape and data type as `image` in which to store results. output : older alias for `out`, will be removed before 1.0. output : numpy ndarray, optional mask : numpy ndarray or rasterio Band object, optional Values of False or 0 will be excluded from feature generation Must evaluate to bool (rasterio.bool_ or rasterio.uint8) connectivity : int, optional Use 4 or 8 pixel connectivity for grouping pixels into features Returns ------- out : numpy ndarray Result Notes ----- GDAL only supports values that can be cast to 32-bit integers for this operation. The amount of memory used by this algorithm is proportional to the number and complexity of polygons found in the image. This algorithm is most appropriate for simple thematic data. Data with high pixel-to-pixel variability, such as imagery, may produce one polygon per pixel and consume large amounts of memory. """ # Start moving users over to 'out'. if output is not None: warnings.warn( "The 'output' keyword arg has been superseded by 'out' " "and will be removed before Rasterio 1.0.", FutureWarning, stacklevel=2) # pragma: no cover out = out if out is not None else output if out is None: out = np.zeros(image.shape, image.dtype) with rasterio.drivers(): _sieve(image, size, out, mask, connectivity) return out
def sieve(image, size, out=None, mask=None, connectivity=4): """Replace small polygons in `image` with value of their largest neighbor. Polygons are found for each set of neighboring pixels of the same value. Parameters ---------- image : numpy ndarray or rasterio Band object (RasterReader, bidx namedtuple) Must be of type rasterio.int16, rasterio.int32, rasterio.uint8, rasterio.uint16, or rasterio.float32 size : int minimum polygon size (number of pixels) to retain. out : numpy ndarray, optional Array of same shape and data type as `image` in which to store results. mask : numpy ndarray or rasterio Band object, optional Values of False or 0 will be excluded from feature generation Must evaluate to bool (rasterio.bool_ or rasterio.uint8) connectivity : int, optional Use 4 or 8 pixel connectivity for grouping pixels into features Returns ------- out : numpy ndarray Result Notes ----- GDAL only supports values that can be cast to 32-bit integers for this operation. The amount of memory used by this algorithm is proportional to the number and complexity of polygons found in the image. This algorithm is most appropriate for simple thematic data. Data with high pixel-to-pixel variability, such as imagery, may produce one polygon per pixel and consume large amounts of memory. """ if out is None: out = np.zeros(image.shape, image.dtype) _sieve(image, size, out, mask, connectivity) return out
def sieve(image, size, connectivity=4, output=None): """Returns a copy of the image, but with smaller features removed. Features smaller than the specified size have their pixel value replaced by that of the largest neighboring features. The image must be of unsigned 8-bit integer (rasterio.byte or numpy.uint8) data type. """ if image.dtype.type != rasterio.ubyte: raise ValueError("Image must be dtype uint8/ubyte") with rasterio.drivers(): return _sieve(image, size, connectivity)
def sieve(image, size, connectivity=4, output=None): """Returns a copy of the image, but with smaller features removed. Features smaller than the specified size have their pixel value replaced by that of the largest neighboring features. The image must be of unsigned 8-bit integer (rasterio.byte or numpy.uint8) data type. """ if image.dtype.type != rasterio.ubyte: raise ValueError("Image must be dtype uint8/ubyte") if output is not None and output.dtype.type != rasterio.ubyte: raise ValueError("Output must be dtype uint8/ubyte") with rasterio.drivers(): return _sieve(image, size, connectivity)
def sieve(image, size, out=None, output=None, mask=None, connectivity=4): """ Replaces small polygons in `image` with the value of their largest neighbor. Polygons are found for each set of neighboring pixels of the same value. Parameters ---------- image : numpy ndarray or rasterio Band object (RasterReader, bidx namedtuple) Must be of type rasterio.int16, rasterio.int32, rasterio.uint8, rasterio.uint16, or rasterio.float32 size : int minimum polygon size (number of pixels) to retain. out : numpy ndarray, optional Array of same shape and data type as `image` in which to store results. output : older alias for `out`, will be removed before 1.0. output : numpy ndarray, optional mask : numpy ndarray or rasterio Band object, optional Values of False or 0 will be excluded from feature generation Must evaluate to bool (rasterio.bool_ or rasterio.uint8) connectivity : int, optional Use 4 or 8 pixel connectivity for grouping pixels into features Returns ------- out : numpy ndarray Result Notes ----- GDAL only supports values that can be cast to 32-bit integers for this operation. The amount of memory used by this algorithm is proportional to the number and complexity of polygons found in the image. This algorithm is most appropriate for simple thematic data. Data with high pixel-to-pixel variability, such as imagery, may produce one polygon per pixel and consume large amounts of memory. """ valid_dtypes = ('int16', 'int32', 'uint8', 'uint16') if np.dtype(image.dtype).name not in valid_dtypes: valid_types_str = ', '.join(('rasterio.{0}'.format(t) for t in valid_dtypes)) raise ValueError('image dtype must be one of: %s' % valid_types_str) if size <= 0: raise ValueError('size must be greater than 0') elif type(size) == float: raise ValueError('size must be an integer number of pixels') elif size > (image.shape[0] * image.shape[1]): raise ValueError('size must be smaller than size of image') if connectivity not in (4, 8): raise ValueError('connectivity must be 4 or 8') if mask is not None: if np.dtype(mask.dtype) not in ('bool', 'uint8'): raise ValueError('Mask must be dtype rasterio.bool_ or ' 'rasterio.uint8') elif mask.shape != image.shape: raise ValueError('mask shape must be same as image shape') # Start moving users over to 'out'. if output is not None: warnings.warn( "The 'output' keyword arg has been superceded by 'out' " "and will be removed before Rasterio 1.0.", FutureWarning, stacklevel=2) out = out if out is not None else output if out is None: if isinstance(image, tuple): out = np.zeros(image.shape, image.dtype) else: out = np.zeros_like(image) else: if np.dtype(image.dtype).name != np.dtype(out.dtype).name: raise ValueError('out raster must match dtype of image') elif out.shape != image.shape: raise ValueError('out raster shape must be same as image shape') with rasterio.drivers(): _sieve(image, size, out, mask, connectivity) return out