class Refinement:
input_image_array = None
input_dataset = None
output_array = None
no_data_value = None
def __init__(self, input_image: pathlib.Path, output_image: pathlib.Path):
"""
Add Refinement - median filter with variable size
Examples
--------
| >>> input_file: pathlib.Path = pathlib.Path("1.tif"):
| >>> output_file: pathlib.Path = pathlib.Path("2.tif")
| >>> with Refinement(input_image=input_file, output_image=output_file) as image:
| >>> image.add_median_filter(size=3)
:param input_image: input image for processing, must exist
:type input_image: pathlib.Path
:param output_image: output image for processing, must not exist
:type output_image: pathlib.Path
"""
assert input_image.exists() is True, logging.error("Input image: " + input_image.__str__() + " not exist.")
self.input_image: pathlib.Path = input_image
assert output_image.exists() is False, logging.error("Output image: " + output_image.__str__() + " not exist.")
self.output_image: pathlib.Path = output_image
def __enter__(self):
"""
Open image and cast to numpy array
:return: self
:rtype: Refinement
"""
self.input_dataset = gdal.Open(self.input_image.__str__(), gdal.GA_ReadOnly)
self.no_data_value = self.input_dataset.GetRasterBand(1).GetNoDataValue()
self.input_image_array = np.array(self.input_dataset.GetRasterBand(1).ReadAsArray())
return self
def __exit__(self, exc_type, exc_val, exc_tb):
"""
Save file to output image
Set no data value
:param exc_type:
:param exc_val:
:param exc_tb:
:return:
"""
file_format = "GTiff"
driver = gdal.GetDriverByName(file_format)
output_dataset = driver.CreateCopy(self.output_image.__str__(), self.input_dataset, strict=0,
options=['COMPRESS=LZW'])
output_dataset.GetRasterBand(1).WriteArray(self.output_array)
# set no data value
if self.no_data_value is not None:
output_dataset.GetRasterBand(1).SetNoDataValue(self.no_data_value)
assert self.output_image.exists() is True, logging.error(
"Output image: " + self.output_image.__str__() + " calculate fail")
logging.info("Finish adding median filter. Output image: " + self.output_image.__str__())
def add_median_filter(self, size: int = 3):
"""
Apply median filter to image
:param size: size of median filter
:type size: int
:return: None
:rtype: None
"""
logging.info("Start adding median filter to: " + self.input_image.__str__())
self.output_array = ndimage.median_filter(input=self.input_image_array, size=size)
input_file: pathlib.Path = pathlib.Path("1.tif")
output_file: pathlib.Path = pathlib.Path("2.tif")
with Refinement(input_image=input_file, output_image=output_file) as image:
image.add_median_filter(size=3)
Czy taka implementacja jest poprawna według wzorca pipe and filters oraz użycia with
w ramach context managera w pythonie?
Co byś tu zmienił? Czy opisy w docstring są poprawne i zrozumiałe?
P.S. staram się sztywno typować czy pola
input_image_array = None
input_dataset = None
output_array = None
powinny posiadać silne typowanie?