From 3f24ba21df51d7c5c74feee727e18239f6b34582 Mon Sep 17 00:00:00 2001
From: feger <marc.feger@hhu.de>
Date: Sat, 20 Apr 2019 15:24:23 +0200
Subject: [PATCH] Seperate into classes; Solve imports; Add doc-strings

---
 GUI.py           |  59 +++++++++++++++++++++++++++----
 color.py         |   7 ----
 color_enum.py    |  11 ++++++
 editor.py        |  23 ++++++++++---
 filter.py        |  88 +++++++++++++++++++++++++++--------------------
 filter_enum.py   |  15 ++++++++
 images/edit.jpeg | Bin 13034 -> 19042 bytes
 mask.py          |  32 ++++++++++++++---
 pixel.py         |  30 ++++++++++++----
 requirements.txt |   1 +
 10 files changed, 200 insertions(+), 66 deletions(-)
 delete mode 100644 color.py
 create mode 100644 color_enum.py
 create mode 100644 filter_enum.py

diff --git a/GUI.py b/GUI.py
index 6d6fa51..a48cdf9 100644
--- a/GUI.py
+++ b/GUI.py
@@ -1,4 +1,4 @@
-from tkinter import Tk, Label, Button, StringVar, OptionMenu
+from tkinter import StringVar, Label, Button, OptionMenu, Tk
 from tkinter.filedialog import askopenfilename
 from tokenize import String
 
@@ -11,6 +11,10 @@ from filter import *
 class GUI(object):
 
     def __init__(self, master):
+        """
+        This class defines the GUI as one.
+        :param master: The Tk root.
+        """
         self.master = master
         self.master.title('Filter')
 
@@ -50,7 +54,13 @@ class GUI(object):
         self.original_image_label.grid(row=1, column=0)
         self.filtered_image_label.grid(row=1, column=1)
 
-    def read_image(self, path: String):
+    def read_image(self, path: String) -> ImageTk.PhotoImage:
+        """
+        This reads an image from a given path and resize it.
+
+        :param path: The path to the image.
+        :return: A image to be used in the frontend
+        """
         return ImageTk.PhotoImage(
             Image.open(path).resize(
                 (self.image_label_width, self.image_label_height),
@@ -58,15 +68,28 @@ class GUI(object):
             )
         )
 
-    def _update_label_image(self, label: Label, new_image, row: int, column: int):
+    def _update_label_image(self, label: Label, new_image, row: int, column: int) -> None:
+        """
+        This method updates to label with a new image.
+
+        :param label: The reference to the label which should be changes.
+        :param new_image: The reference to the new image.
+        :param row: Row in the GUI.
+        :param column: Column in the GUI.
+        :return: None
+        """
         label.destroy()
         label = Label(self.master, image=new_image)
         label.image = new_image
         label.pack()
         label.grid(row=row, column=column)
 
-    def set_new_file(self):
-        # Todo: Specify more formats
+    def set_new_file(self) -> None:
+        """
+        This sets the new file and refreshed the paths as well with the lables.
+
+        :return: None
+        """
         self.image_path: String = askopenfilename(initialdir='/', title='Select file',
                                                   filetypes=(('jpeg files', '*.jpeg'), ('all files', '*.*')))
 
@@ -77,17 +100,39 @@ class GUI(object):
         self.filter.set(FILTER.empty.value)
         self._update_label_image(self.filtered_image_label, new_image, 1, 1)
 
-    def change_filter(self, *args):
+    def change_filter(self, *args) -> None:
+        """
+        This changes the filter and updates the label for the edited images.
+
+        :param args: Arguments of the listener.
+        :return: None
+        """
         self.edit_image()
         edited_image = self.read_image(self.edit_path)
         self._update_label_image(self.filtered_image_label, edited_image, 1, 1)
 
-    def edit_image(self):
+    def edit_image(self) -> None:
+        """
+        This method edits a given image and saves it.
+
+        :return: None
+        """
         print('From: ' + self.image_path + ' to ' + self.edit_path + ' with ' + self.filter.get())
         Editor(self.image_path, self.edit_path).do_convolution_with(self.filter.get())
+        print('Done...')
 
 
 if __name__ == '__main__':
+    """
+    This program is for editing images with a given filter.
+    The user can choose between all filters defined in the FILTER enum.
+    
+    To use the program run:
+        $ python3 GUI.py
+    
+    Notice: The edited image will be saved in ./images/edited.py. Each new filter will overwrite this image. This may
+    take a while.
+    """
     root = Tk()
     root.resizable(False, False)
     my_gui = GUI(root)
diff --git a/color.py b/color.py
deleted file mode 100644
index d940325..0000000
--- a/color.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from enum import Enum
-
-
-class COLOR(Enum):
-    red = 0
-    green = 1
-    blue = 2
diff --git a/color_enum.py b/color_enum.py
new file mode 100644
index 0000000..b9e0e1e
--- /dev/null
+++ b/color_enum.py
@@ -0,0 +1,11 @@
+from enum import Enum
+
+
+class COLOR(Enum):
+    """
+    This enum defines the index-range of the colors in the image.
+    Notice: All images must be a RGB-image (MxNx3).
+    """
+    red = 0
+    green = 1
+    blue = 2
diff --git a/editor.py b/editor.py
index 8be8a9e..762bd6b 100644
--- a/editor.py
+++ b/editor.py
@@ -1,3 +1,6 @@
+import copy
+from tokenize import String
+
 from skimage import io
 
 from pixel import *
@@ -5,14 +8,26 @@ from pixel import *
 
 class Editor(object):
 
-    def __init__(self, origin_path, edit_path):
+    def __init__(self, origin_path: String, edit_path: String):
+        """
+        This class is the editor which edits a given image and stores a new one.
+
+        :param origin_path: The original image which should be edited.
+        :param edit_path: The edited image which should be stored.
+        """
         self.image_path = origin_path
         self.edit_path = edit_path
 
-    def do_convolution_with(self, option):
+    def do_convolution_with(self, option: String) -> None:
+        """
+        This method iterates over the image and changes each pixel by a given method.
+        Notice, that the image must be a RGB-image (MxNx3).
+
+        :param option: The options defined in FILTER.
+        :return: None
+        """
         image = io.imread(fname=self.image_path)
-        edited_image = io.imread(fname=self.image_path)  # copy.deepcopy(image)
-        # if image is grey scale then there is only width and height
+        edited_image = copy.deepcopy(image)  # io.imread(fname=self.image_path)
         height, width, _ = image.shape
 
         for v in range(height):
diff --git a/filter.py b/filter.py
index 0c9ba54..58ca9cf 100644
--- a/filter.py
+++ b/filter.py
@@ -1,35 +1,55 @@
 import numpy as np
+from enum import Enum
+from tokenize import String
+from typing import List, Tuple
+from unittest.test.testmock.testpatch import function
 
-from color import *
-from mask import *
-
+import imageio
 
-class FILTER(Enum):
-    empty = '---'
-    mod_laplacian = 'Modified Laplacian'
-    laplacian = 'Laplacian'
-    gaussian = 'Gaussian'
-    median = 'Median'
-    box = 'Box'
-    min = 'Min'
-    max = 'Max'
+from color_enum import *
+from filter_enum import *
+from mask import *
 
 
 class Filter(object):
 
-    def __init__(self, image, v, u):
+    def __init__(self, image: imageio.core.util.Array, v: int, u: int) -> None:
+        """
+        This class edits a pixel in a image with a given filter.
+
+        :param image: The image in which the filter should be used.
+        :param v: The v coordinate
+        :param u: The u coordinate
+        """
         self.image = image
         self.v = v
         self.u = u
 
-    def use(self, option, linear=True, dim=(5, 5)):
+    def use(self, option: String = FILTER.empty.value, linear: bool = True, dim: Tuple = (5, 5),
+            f: function = np.min) -> List:
+        """
+        With this method it can be decided if a linear or non-linear filter should be used.
+
+        :param f: The filter function to be used.
+        :param option: The name of the filter to be used.
+        :param linear: Is the filter linear.
+        :param dim: The dimension of the filter.
+        :return: A new rgb-pixel
+        """
         if linear:
             return self.linear_filter(option)
         else:
-            return self.non_linear_filter(option, dim)
+            return self.non_linear_filter(f, dim)
+
+    def linear_filter(self, option: String) -> List:
+        """
+        This method is for filtering with linear filters.
+        Notice: All filter-matrices must have a uneven dimension.
+
+        :param option: The name of the filter to be used.
+        :return: A modified rgb-pixel
+        """
 
-    def linear_filter(self, option):
-        # just filter with uneven dimensions
         height_I, width_I, _ = self.image.shape
 
         H = np.matrix(Mask().H[option])
@@ -50,9 +70,16 @@ class Filter(object):
                                                   np.multiply(1 / divider, H[center_j + j, center_i + i])
         return new_pixel
 
-    def non_linear_filter(self, option, dim=(5, 5)):
+    def non_linear_filter(self, f: function, dim: Tuple = (5, 5)) -> List:
+        """
+        This method is for filtering with linear filters.
+        Notice: All filter-regions R must have a uneven dimension.
+
+        :param f: The filter function to be used.
+        :param dim: The dimension of filter-region R.
+        :return: A modified rgb-pixel
+        """
 
-        # just filter with uneven dimensions
         height_I, width_I, _ = self.image.shape
         height_R, width_R = dim
         center_i = center_j = int(height_R / 2)
@@ -65,21 +92,8 @@ class Filter(object):
                     for color in COLOR:
                         colors_neighbors[color.value] += [self.image[self.v + j, self.u + i, color.value]]
 
-        if option == FILTER.median.value:
-            return [
-                np.median(colors_neighbors[COLOR.red.value]),
-                np.median(colors_neighbors[COLOR.green.value]),
-                np.median(colors_neighbors[COLOR.blue.value])
-            ]
-        elif option == FILTER.min.value:
-            return [
-                np.min(colors_neighbors[COLOR.red.value]),
-                np.min(colors_neighbors[COLOR.green.value]),
-                np.min(colors_neighbors[COLOR.blue.value])
-            ]
-        elif option == FILTER.max.value:
-            return [
-                np.max(colors_neighbors[COLOR.red.value]),
-                np.max(colors_neighbors[COLOR.green.value]),
-                np.max(colors_neighbors[COLOR.blue.value])
-            ]
+        return [
+            f(colors_neighbors[COLOR.red.value]),
+            f(colors_neighbors[COLOR.green.value]),
+            f(colors_neighbors[COLOR.blue.value])
+        ]
diff --git a/filter_enum.py b/filter_enum.py
new file mode 100644
index 0000000..dc8c77e
--- /dev/null
+++ b/filter_enum.py
@@ -0,0 +1,15 @@
+from enum import Enum
+
+
+class FILTER(Enum):
+    """
+    This enum defines all filters.
+    """
+    empty = '---'
+    mod_laplacian = 'Modified Laplacian'
+    laplacian = 'Laplacian'
+    gaussian = 'Gaussian'
+    median = 'Median'
+    box = 'Box'
+    min = 'Min'
+    max = 'Max'
diff --git a/images/edit.jpeg b/images/edit.jpeg
index 8782bb9b020ec6fbecf2a5b2d9919486ec4e4739..60dc966838f446baf89a8d602d08a3b0f49ceb32 100644
GIT binary patch
literal 19042
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

delta 12925
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

diff --git a/mask.py b/mask.py
index 77cfbc1..b1926a7 100644
--- a/mask.py
+++ b/mask.py
@@ -1,9 +1,14 @@
+from typing import List
+
 from filter import *
 
 
 class Mask(object):
 
     def __init__(self):
+        """
+        This class contains all filter matrices which can be accessed via H.
+        """
         self.H = {
             FILTER.gaussian.value: self._gaussian(),
             FILTER.laplacian.value: self._laplacian(),
@@ -12,7 +17,11 @@ class Mask(object):
         }
 
     @staticmethod
-    def _gaussian():
+    def _gaussian() -> List[List]:
+        """
+        Gaussian-Blur for smoothing images.
+        :return: Gaussian-Blur-Matrix
+        """
         return [[0, 1, 2, 1, 0],
                 [1, 3, 5, 3, 1],
                 [2, 5, 9, 5, 2],
@@ -20,15 +29,24 @@ class Mask(object):
                 [0, 1, 2, 1, 0]]
 
     @staticmethod
-    def _laplacian():
+    def _laplacian() -> List[List]:
+        """
+        Laplacian-Filter is a difference-filter for finding edges.
+        :return:  Laplacian-Filter-Matrix
+        """
         return [[0, 0, -1, 0, 0],
                 [0, -1, -2, -1, 0],
-                [-1, -2, 10, -2, -1],
+                [-1, -2, 16, -2, -1],
                 [0, -1, -2, -1, 0],
                 [0, 0, -1, 0, 0]]
 
     @staticmethod
-    def _modified_laplacian():
+    def _modified_laplacian() -> List[List]:
+        """
+        Modified Laplacian-Filter is a difference-filter for finding edges.
+        It emphasizes the edges more.
+        :return:  Modified-Laplacian-Filter-Matrix
+        """
         return [[0, 0, -1, 0, 0],
                 [0, -1, -200, -1, 0],
                 [-1, -200, 1000, -200, -1],
@@ -36,7 +54,11 @@ class Mask(object):
                 [0, 0, -1, 0, 0]]
 
     @staticmethod
-    def _box():
+    def _box() -> List[List]:
+        """
+        Box-Blur for smoothing images.
+        :return: Box-Blur-Filter-Matrix
+        """
         return [[0, 0, 0, 0, 0],
                 [0, 1, 1, 1, 0],
                 [0, 1, 1, 1, 0],
diff --git a/pixel.py b/pixel.py
index d6bfe21..97e585c 100644
--- a/pixel.py
+++ b/pixel.py
@@ -1,13 +1,31 @@
-from filter import *
+import numpy as np
+from typing import List
+
+import imageio
+
+from filter import FILTER, Filter
 
 
 class Pixel(object):
-    def __init__(self, image, v, u):
+    def __init__(self, image: imageio.core.util.Array, v: int, u: int):
+        """
+        This class edits a pixel in a image with a given filter.
+
+        :param image: The image in which the filter should be used.
+        :param v: The v coordinate
+        :param u: The u coordinate
+        """
         self.image = image
         self.v = v
         self.u = u
 
-    def filter_with(self, option: str):
+    def filter_with(self, option: str) -> List:
+        """
+        This method gets the new pixel edited with a given filter.
+
+        :param option: The name of the filter to be used.
+        :return: New pixel edited with a given filter
+        """
         if option == FILTER.empty.value:
             return self.image[self.v, self.u]
         elif option == FILTER.laplacian.value:
@@ -19,8 +37,8 @@ class Pixel(object):
         elif option == FILTER.box.value:
             return Filter(self.image, self.v, self.u).use(FILTER.box.value)
         elif option == FILTER.median.value:
-            return Filter(self.image, self.v, self.u).use(FILTER.median.value, linear=False, dim=(5, 5))
+            return Filter(self.image, self.v, self.u).use(linear=False, dim=(5, 5), f=np.median)
         elif option == FILTER.min.value:
-            return Filter(self.image, self.v, self.u).use(FILTER.min.value, linear=False, dim=(5, 5))
+            return Filter(self.image, self.v, self.u).use(linear=False, dim=(5, 5), f=np.min)
         elif option == FILTER.max.value:
-            return Filter(self.image, self.v, self.u).use(FILTER.max.value, linear=False, dim=(5, 5))
+            return Filter(self.image, self.v, self.u).use(linear=False, dim=(5, 5), f=np.max)
diff --git a/requirements.txt b/requirements.txt
index 32ba7c4..0f25081 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,4 @@
+imageio==2.5.0
 Pillow==6.0.0
 scikit-image==0.15.0
 numpy == 1.16.2
\ No newline at end of file
-- 
GitLab