From 4db1350ce2df762ac91cc51b7917aa01893ece92 Mon Sep 17 00:00:00 2001
From: Sebastian Schwarz
 <Sebastian_Vincent.Schwarz@cs.Reutlingen-University.DE>
Date: Mon, 16 May 2022 16:16:22 +0200
Subject: [PATCH] convolve added + writeToFile fixed

---
 Bildfaltung/ClampingBorderBehavior.py         |   7 ++-
 Bildfaltung/Image.py                          |  54 +++++++++++++++---
 Bildfaltung/KernelFactory.py                  |  11 +++-
 Bildfaltung/ZeroPaddingBorderBehavior.py      |   2 +
 .../ClampingBorderBehavior.cpython-310.pyc    | Bin 830 -> 904 bytes
 Bildfaltung/__pycache__/Image.cpython-310.pyc | Bin 1910 -> 3029 bytes
 .../__pycache__/KernelFactory.cpython-310.pyc | Bin 1361 -> 1416 bytes
 .../ZeroPaddingBorderBehavior.cpython-310.pyc | Bin 593 -> 617 bytes
 Bildfaltung/main.py                           |  33 +++++++----
 9 files changed, 83 insertions(+), 24 deletions(-)

diff --git a/Bildfaltung/ClampingBorderBehavior.py b/Bildfaltung/ClampingBorderBehavior.py
index bf23ee2..62635ed 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 29666e4..08331d7 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 0901e12..ba95fcf 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 48b7aeb..ffad143 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
GIT binary patch
delta 366
zcmdnT*1^t~&&$ij00fi#nv&d@C-QCMkK)WttcWj5%qdM>$xy^T@p2p^=VT+s%=$S%
zWmOtAj46!S48@!^Odz^Qp@ab>Qp23Zn8GB<kisOv(9B%R0u%+xgGCwPqO5uBHOw_Y
zehpA%I72WH=gG4$lrUAgGctf6ezSm9Ouo&it6szjbjU5%;*7+C)LUGhc`2zCu0=)p
zMVf54Sc+3~(rz(k-eSzUHCdlY)`T6Xv<OUafHd)@r<Md{R;1>HfxIUG6e<=25==}2
zjAD!ujC@Qi|9F@uS1?8UA~eEv7l8tb7o>*;NN_OlFoQ+>G?|N-fC6A=fkhw|B23_z
ItiUV>09_|a#sB~S

delta 291
zcmeBR-^a$6&&$ij00afrl}VGCCh~3Lzr~rGSP@^Am{Xd%lA(xW;^jC-uE|D>nGR7v
zWmW7o%r%UX3^h!W4B-sH3@i*K43%n(3?Nv-Si_jYSi_vflme7ZVUl2IX0BxciZVe&
zC(APFs^8-B%u7kFa4jmzFDe4re2cX>Be5V=lkFBuacWN5Eym1Sj9F2W3z=kfIDpbc
zV1g5*kT*TGBp|aQH75+@Hh!Q`F&~g%V&Y@uVVr!3DcTpI0j{fv8>oaAq?QFpa4_&N
bfkpf@nTwc!0$?YAMIaU-OyHcH#ViK^&96IH

diff --git a/Bildfaltung/__pycache__/Image.cpython-310.pyc b/Bildfaltung/__pycache__/Image.cpython-310.pyc
index 18dfef5b00460505f83972e439800460fa9536cb..a639824500f52eb117399f062d533a2342b6b91c 100644
GIT binary patch
literal 3029
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

delta 795
zcmZWn&2G~`5Z+m@?TzEOrBz5nQR$%xSe1%Yamfh@P!X312~Lqvo79FzO=2=OiHPjx
z;3ug30&s)_7j7U9JOmd%1_ut6DzW4KP++b3_VdinH#@ugqxQ>jf=b0=YHViM`!0{2
z1K2p8Hk!|vD|7wHu=~p2=M+C5i)xn29x4mJd_Lkw0IS)lc2ADKMNVv`kUbV3VIlh|
z4sA+w7jqH%gO}M<-xD7gHnU}DE!*gKy&VjOJN<!glGa{!qVEbDBxJirb*?Gj#i0Gs
znxf_>MIsh+4^p0J9#4d)CAu;rhDYp$m6);Ni5g3c2x2pZL?2gT?H%{@_W+Doq{Vs)
zo>60p87b75XV%!2s7PUc;fe$;QNpW<R9q!0zL1p8g&>x77MJSmOprvz_lt67!CM}q
zlWfoUbQ4Qz>j(tY%}jf`ZJoe+4wkDU^@vpkxjw~yH1~5Yj1aFYk89zInmSq+5$m+>
z2EjVP8o@0ExrV_MH|V!P(7c4(6fKje|2&}MZYf7di53??pH!a(7GHxUu(=I4!JdOS
zon0%gf9p!>Ur&K<m%1sgMJQ7A3hkn{%R9!Qk0XE3ae4uIK0fddx|4o@|87n02ct<a
znD}ia5t68Y*^+Zs`!ePl*-E+5yQ9LmMR1qkPnQLwR*_zgt}LWyDw*VR+pZSgwyWj(
U=*{r;Tck3D?>~v`Yq<{MH|w{ZHvj+t

diff --git a/Bildfaltung/__pycache__/KernelFactory.cpython-310.pyc b/Bildfaltung/__pycache__/KernelFactory.cpython-310.pyc
index 66ad584ce838b1fa84b7a5fbd9875f888ed4136a..eeb46e94b76f8390fa1b55b2d6ec33056a2dc2c3 100644
GIT binary patch
delta 239
zcmcb})xph|&&$ij00h06)kzA>8~Ii+d0GIu9SkXqVhkxv*~~>!Da;)}z6gUfLnmW9
zLpx&{QwmE8YYRsSP_&uR1&C`IYZ!wWQrLnSG}--LG6D4$F$0OoPnni8icaoj4pHF-
za&IwKu4KB!Qk+?pTEq)d!wMqUKm;F<5S`4*VryO{?wMDXn3I{Jkd$AMmYGwMTBHEd
zp;*KZRHMmMBn+gYIDwLGU`dD}LX#6%<ODz-;bG!olwf3GVqvb5oh-;AJ9#;a1Ea{~
H7c7|opT0EM

delta 203
zcmeC+zR1Ow&&$ij00inRl}X!~Hu9}t($@fTQy4oKIv7M4q!~IH+Zoy!)0k42QkYvf
zN`Ruxj4nW2%UHu0%%I8QH~Bx)az>HK%b7z|KqlQ{tX#=-i={ZTDz%6Q$S-0A5o{oW
z7f6UqmS?ebE8+t(HJOTpfK(J`QhtS7W==_J5k##ZNG(XiE&k-9)WnihCzw1)rWho{
U!z97T!Zdk5OFX0SWO>$10DnR&y#N3J

diff --git a/Bildfaltung/__pycache__/ZeroPaddingBorderBehavior.cpython-310.pyc b/Bildfaltung/__pycache__/ZeroPaddingBorderBehavior.cpython-310.pyc
index 36c1eb5b7789b3435a960975f3d6ae3990801e06..99cb2365be530d6e66b2e94ac7e09bbf5cd168d7 100644
GIT binary patch
delta 84
zcmcb}@{)x&pO=@50SGqwG$rks$a_@J0?4UhOkvDsDCVeP0?|cWDU87kRqQp)HH?xB
iHB6EW;S9kHEDR+KmC_U6%;n$%>JVULVVvB{cmx1aP7@&j

delta 60
zcmaFKa*>5MpO=@50SMaoDwDb<@*b5^0dlI?YnW>oB^hd%BpJdPf*DvCN*F2yCo#@t
L0jZt5l<^1vm4yuv

diff --git a/Bildfaltung/main.py b/Bildfaltung/main.py
index 61e12d0..f5e1e52 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))
+
+
+
+
+
+
+
 
 
 
-- 
GitLab