diff --git a/Bildfaltung/ClampingBorderBehavior.py b/Bildfaltung/ClampingBorderBehavior.py index bf23ee22b464998b839cebe26475a6a15f4a5ba5..62635edddd70fead5c95b05d43467808365e9323 100644 --- a/Bildfaltung/ClampingBorderBehavior.py +++ b/Bildfaltung/ClampingBorderBehavior.py @@ -12,10 +12,15 @@ def clamp(num, min_value, max_value): class ClampingBorderBehavior(BorderBehavior): + def getPixelValue(self, i, j, image): try: - return image[i][j] + if i < 0 or j < 0: + clamped_i = clamp(i, 0, image.shape[1] - 1) + clamped_j = clamp(j, 0, image.shape[0] - 1) + else: + return image[i][j] except IndexError: clamped_i = clamp(i, 0, image.shape[1]-1) clamped_j = clamp(j, 0, image.shape[0]-1) diff --git a/Bildfaltung/Image.py b/Bildfaltung/Image.py index 29666e46870d19c1c74da6f622e5262d516aa49b..08331d7b6667f518fbd23872b102102f557c1b5f 100644 --- a/Bildfaltung/Image.py +++ b/Bildfaltung/Image.py @@ -1,9 +1,21 @@ from numpy import array - class Image: + + def __init__(self): + self.__imageData = None + + def get_imageData(self): + return self.__imageData + + def set_imageData(self, value): + self.__imageData = value + return self.__imageData + + + def readFromFile(self, filename): try: f = open(filename, "r") @@ -51,16 +63,23 @@ class Image: for j in range(width): temp.append(elem[i * width + j]) img.append(temp) - return (array(img)) + Image.set_imageData(self, array(img)) + + return self.__imageData - def writeToFile(self, arr, filename): + def writeToFile(self, filename): + + try: + f = open(filename, "w+") + except IOError: + print("Cannot open file") + exit() - f = open(filename, "w+") maxVal = 255 width = 0 height = 0 - for row in arr: + for row in self.__imageData: height = height + 1 width = len(row) @@ -70,10 +89,29 @@ class Image: for i in range(height): for j in range(width): - f.write(str(arr[i][j]) + ' ') + f.write(str(self.__imageData[i][j]) + ' ') f.write('\n') + def get_filtered_pixel(self, i, j, imageData, kernel, borderBehavior): + kernel_half = int((len(kernel) - 1) / 2) + final_pixel_value = 0 + + for k in range(-kernel_half, kernel_half + 1): + for l in range(-kernel_half, kernel_half + 1): + kernel_factor = kernel[k + kernel_half][l + kernel_half] + current_pixel = borderBehavior.getPixelValue(i + k, j + l, self.__imageData) + current_pixel = int(current_pixel) + final_pixel_value += current_pixel * kernel_factor + return int(final_pixel_value) + + def convolve(self, kernel, borderBehavior): + + rows = len(self.__imageData) + cols = len(self.__imageData[0]) + + for i in range(cols): + for j in range(rows): + self.__imageData[i][j] = Image.get_filtered_pixel(self, i, j, self.__imageData, kernel, borderBehavior) + return self.__imageData - def convolve(kernel, borderBehavior): - pass \ No newline at end of file diff --git a/Bildfaltung/KernelFactory.py b/Bildfaltung/KernelFactory.py index 0901e12c0542267468fb173ac355eef01ba14310..ba95fcf1398af18ae9060097c6dd996ba28383d2 100644 --- a/Bildfaltung/KernelFactory.py +++ b/Bildfaltung/KernelFactory.py @@ -16,9 +16,14 @@ class KernelFactory: @staticmethod def createBoxFilter(size): - value = 1/(size*size) - boxFilter = [[value for x in range(size)] for y in range(size)] + if size % 2 != 0: + value = 1/(size*size) + boxFilter = [[value for x in range(size)] for y in range(size)] + + return boxFilter + + else: + return("Invalid boxfilter size!") - return boxFilter diff --git a/Bildfaltung/ZeroPaddingBorderBehavior.py b/Bildfaltung/ZeroPaddingBorderBehavior.py index 48b7aeb05baf3b17d4352936d58df7cef7c87f4e..ffad14335ee719bb5f814ff9844fe5c4ee952062 100644 --- a/Bildfaltung/ZeroPaddingBorderBehavior.py +++ b/Bildfaltung/ZeroPaddingBorderBehavior.py @@ -8,6 +8,8 @@ Bildes, wie in Abbildung 2 oben dargestellt, den Wert 0 zurückgibt class ZeroPaddingBorderBehavior(BorderBehavior): def getPixelValue(self, i, j, image): + if i < 0 or j < 0: + return 0 try: return image[i][j] except IndexError: diff --git a/Bildfaltung/__pycache__/ClampingBorderBehavior.cpython-310.pyc b/Bildfaltung/__pycache__/ClampingBorderBehavior.cpython-310.pyc index 43a303511bdcafa64288b3725d9c70978953e005..3e2af1ba63f1049df8c3fe6266fba80de1cab06d 100644 Binary files a/Bildfaltung/__pycache__/ClampingBorderBehavior.cpython-310.pyc and b/Bildfaltung/__pycache__/ClampingBorderBehavior.cpython-310.pyc differ diff --git a/Bildfaltung/__pycache__/Image.cpython-310.pyc b/Bildfaltung/__pycache__/Image.cpython-310.pyc index 18dfef5b00460505f83972e439800460fa9536cb..a639824500f52eb117399f062d533a2342b6b91c 100644 Binary files a/Bildfaltung/__pycache__/Image.cpython-310.pyc and b/Bildfaltung/__pycache__/Image.cpython-310.pyc differ diff --git a/Bildfaltung/__pycache__/KernelFactory.cpython-310.pyc b/Bildfaltung/__pycache__/KernelFactory.cpython-310.pyc index 66ad584ce838b1fa84b7a5fbd9875f888ed4136a..eeb46e94b76f8390fa1b55b2d6ec33056a2dc2c3 100644 Binary files a/Bildfaltung/__pycache__/KernelFactory.cpython-310.pyc and b/Bildfaltung/__pycache__/KernelFactory.cpython-310.pyc differ diff --git a/Bildfaltung/__pycache__/ZeroPaddingBorderBehavior.cpython-310.pyc b/Bildfaltung/__pycache__/ZeroPaddingBorderBehavior.cpython-310.pyc index 36c1eb5b7789b3435a960975f3d6ae3990801e06..99cb2365be530d6e66b2e94ac7e09bbf5cd168d7 100644 Binary files a/Bildfaltung/__pycache__/ZeroPaddingBorderBehavior.cpython-310.pyc and b/Bildfaltung/__pycache__/ZeroPaddingBorderBehavior.cpython-310.pyc differ diff --git a/Bildfaltung/main.py b/Bildfaltung/main.py index 61e12d0ab1bd127f86c9663ad3067b403f591263..f5e1e52f611a0e0a36b77dd7c8c21a6d7e5c12ca 100644 --- a/Bildfaltung/main.py +++ b/Bildfaltung/main.py @@ -1,26 +1,35 @@ -from ClampingBorderBehavior import ClampingBorderBehavior from Image import Image -import numpy as np from KernelFactory import KernelFactory from ZeroPaddingBorderBehavior import ZeroPaddingBorderBehavior +from ClampingBorderBehavior import ClampingBorderBehavior + +'''RELATIVE PFADE!''' path = "E:/Downloads/test.pgm" path1 = "E:/Downloads/test1.pgm" -array = np.random.randint(256, size=(4, 4)) +path2 ="E:/Downloads/test2.pgm" +#array = np.random.randint(256, size=(4, 4)) -def clamp(num, min_value, max_value): - num = max(min(num, max_value), min_value) - return num if __name__ == '__main__': - print(array) - #img = Image() - #img.writeToFile(array, path1) - #print(img.readFromFile(path1)) - test = ClampingBorderBehavior() - print(test.getPixelValue(1, 4, array)) + + img = Image() + print(img.readFromFile(path1)) + img.writeToFile(path2) + clamping = ClampingBorderBehavior() + zero = ZeroPaddingBorderBehavior() + kernel = KernelFactory.createHorizontalPrewittKernel() + img.readFromFile(path1) + print(img.convolve(kernel, clamping)) + + + + + + +