Source code for django_website.ImageFilters.GreeneryFilter
from urllib.error import HTTPError
import imageio
import scipy
import numpy as np
from skimage import color, img_as_float, img_as_ubyte
import matplotlib.pyplot as plt
from scipy import misc, ndimage
import json
from json import JSONDecodeError
from geojson import Point, MultiPoint, LineString, MultiLineString, Feature, FeatureCollection
from .ImageFilter import ImageFilter
from .commonFunctions import mt_li_espectral, overlay_mask
from django_website.Primitives.GeoImage import GeoImage, CustomJSONEncoder
from django_website.LogGenerator import write_to_log
from django.utils.translation import gettext as _, gettext_lazy
import sys
[docs]class GreeneryFilter(ImageFilter):
"""Image filter for greenery objects in images"""
filterName = gettext_lazy("Greenery")
filterId = "greenery"
@classmethod
def _initialize(cls):
pass
@classmethod
def _setOutput(cls, geoImage, featureLeaf, index):
try:
ndarrayImage = img_as_float(imageio.imread(geoImage.data))
mask = mt_li_espectral(ndarrayImage)
density = np.count_nonzero(mask)/mask.size
mask = img_as_ubyte(overlay_mask(ndarrayImage, mask))
geoImage.setProcessedData(cls.filterId, 'ndarray', mask, density=density)
featureLeaf[index] = geoImage
except HTTPError:
write_to_log(f"Http error - Have the quota been achieved?")
except ValueError:
write_to_log(f'Image bytes: {ndarrayImage[:100]}')
except Exception as e:
write_to_log(f"Unexpected error: {sys.exc_info()[0]}")
write_to_log(f"Error message: {e.args}")
write_to_log(f'Offending url: {geoImage.data[:300]}')
[docs] @classmethod
def processImageFromFeatureCollection(cls, featureCollection: FeatureCollection) -> FeatureCollection:
"""Receives a feature collection of point/line or their multi equivalents and returns a list of GeoImage's"""
for feature in featureCollection['features']:
if feature['geometry']['type'] == 'MultiPolygon':
#Number of Polygons
for polygonIndex, polygon in enumerate(feature['geometry']['coordinates']):
for lineIndex, lineString in enumerate(polygon):
for coordinateIndex in range(len(lineString)):
geoImage = feature['properties']['geoImages'][polygonIndex][lineIndex][coordinateIndex]
if not isinstance(geoImage, dict): continue
try:
geoImage = GeoImage.fromJSON(geoImage)
except JSONDecodeError:
print(_('Error while parsing panorama: ') + str(geoImage)[:100])
cls._setOutput(geoImage, feature['properties']['geoImages'][polygonIndex][lineIndex], coordinateIndex)
elif (feature['geometry']['type'] == 'MultiLineString') or (feature['geometry']['type'] == 'Polygon'):
for lineIndex, lineString in enumerate(feature['geometry']['coordinates']):
for coordinateIndex in range(len(lineString)):
try:
geoImage = feature['properties']['geoImages'][lineIndex][coordinateIndex]
if not isinstance(geoImage, dict): continue
except Exception as exception:
raise Exception(f'lineIndex: {lineIndex}, coordinateIndex: {coordinateIndex}')
try:
geoImage = GeoImage.fromJSON(geoImage)
except JSONDecodeError:
write_to_log(_('Error while parsing panorama: ') + str(geoImage)[:100])
except Exception:
raise Exception(f'lineIndex: {lineIndex}, coordinateIndex: {coordinateIndex}')
cls._setOutput(geoImage, feature['properties']['geoImages'][lineIndex], coordinateIndex)
elif (feature['geometry']['type'] == 'LineString') or (feature['geometry']['type'] == 'MultiPoint'):
for coordinateIndex in range(len(feature['geometry']['coordinates'])):
geoImage = feature['properties']['geoImages'][coordinateIndex]
if not isinstance(geoImage, dict): continue
try:
geoImage = GeoImage.fromJSON(geoImage)
except JSONDecodeError:
print(_('Error while parsing panorama: ') + str(geoImage)[:100])
cls._setOutput(geoImage, feature['properties']['geoImages'], coordinateIndex)
elif feature['geometry']['type'] == 'Point':
coordinateIndex = 0
geoImage = feature['properties']['geoImages'][coordinateIndex]
if not isinstance(geoImage, dict): continue
try:
geoImage = GeoImage.fromJSON(geoImage)
except JSONDecodeError:
print(_('Error while parsing panorama: ') + str(geoImage)[:100])
cls._setOutput(geoImage, feature['properties']['geoImages'], coordinateIndex)
return featureCollection
def _processImageMock() -> GeoImage:
imageMock = GeoImage(imageio.imread('django_website/Testing/gsvimagetestmock.png'))
mask = mt_li_espectral(imageMock.data)
imageMock.data[~mask, 1:2] = .0
imageMock.data[mask, 0] = .0
imageMock.data[mask, 2] = .0
retimg = imageMock.data
return retimg